C++ 为什么散列<;常量字符*>;适用于字符串,但不适用于字符串变量?

C++ 为什么散列<;常量字符*>;适用于字符串,但不适用于字符串变量?,c++,hash,C++,Hash,我的问题是为什么下面的代码可以工作 hash<const char*> PassHash; cout << PassHash("Hello World"); hash-PassHash; coutstd::hash的定义与以下类似 template<typename T> struct hash { size_t operator()(const T& value) const { ... } } 模板 结构散列{ size\u

我的问题是为什么下面的代码可以工作

hash<const char*> PassHash;

cout << PassHash("Hello World");
hash-PassHash;

cout
std::hash
的定义与以下类似

template<typename T>
struct hash {
  size_t operator()(const T& value) const {
    ...
  }
}
模板
结构散列{
size\u t运算符()(常量和值)常量{
...
}
}
因此,
std::hash
模板实例化定义了一个
操作符()
,它接受一个
const char*
,但传递的是一个不同类型的
std::string


只需直接对密码变量使用
std::string
,而不是
std::hash

std::hash
的定义类似于以下内容

template<typename T>
struct hash {
  size_t operator()(const T& value) const {
    ...
  }
}
模板
结构散列{
size\u t运算符()(常量和值)常量{
...
}
}
因此,
std::hash
模板实例化定义了一个
操作符()
,它接受一个
const char*
,但传递的是一个不同类型的
std::string


只需直接对密码变量使用
std::string
,然后改为使用
std::hash

没有从
std::string
const char*
的隐式转换,这是使示例工作所必需的

您可以调用
string::c_str()
来显式执行此“转换”


现场演示:

没有从
std::string
const char*
的隐式转换,这是使示例正常工作所必需的

您可以调用
string::c_str()
来显式执行此“转换”


实时演示:

因为
std::string
不是
const char*
,并且没有适用的转换运算符。使用密码.c_str()
。因为
字符串
不是
常量字符*
。。。如果您计划将其用于实际密码,
cout ps为什么?请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出。“请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出”。。。这是真的吗?如果能给我一个参考链接,我将不胜感激。@Martin“请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出”。。。这是真的吗?请给我一个参考链接。因为
std::string
不是
const char*
,并且没有适用的转换运算符。使用密码.c_str()
。因为
字符串
不是
常量字符*
。。。如果您计划将其用于实际密码,
cout ps为什么?请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出。“请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出”。。。这是真的吗?如果能给我一个参考链接,我将不胜感激。@Martin“请注意,std::hash不一定在下次运行程序时为相同的输入生成相同的输出”。。。这是真的吗?如果能给我一些参考资料的链接,我将不胜感激。。。
std::string::data()
有什么问题吗?我认为它增加了一致性(例如,与
std::vector::data()
)相比)。。。但是对于
hash
它没有什么区别,因为它只是散列指针(对于C字符串没有专门化)。。。
std::string::data()
有什么问题吗?我认为它增加了一致性(例如,与
std::vector::data()
)相比)。。。但是对于
hash
它没有什么区别,因为它只是对指针进行散列(对于C字符串没有专门化)。您也可以使用
const char*
作为
std::hash
的参数,因为它将隐式转换为std::string。
std::hash
std::hash
之间更重要的区别是前者只散列指针,而后者散列整个字符串。@zett42:这是一个实质性的区别,如果你不知道自己在做什么,使用
std::hash
会导致奇怪的模糊行为。例如,两个
const char*
表示相同的序列,但分配在不同位置的堆上。您也可以使用
const char*
作为
std::hash
的参数,因为它将隐式转换为std::string。
std::hash
std::hash
之间更重要的区别是前者只散列指针,而后者散列整个字符串。@zett42:这是一个实质性的区别,如果你不知道自己在做什么,使用
std::hash
会导致奇怪的模糊行为。例如,两个
const char*
表示相同的序列,但分配在不同位置的堆上。
template<typename T>
struct hash {
  size_t operator()(const T& value) const {
    ...
  }
}
hash<const char*> PassHash;
string password;
password = "Hello World";

cout << PassHash(password.c_str());
const char* password1 = "Hello World";
string password2 = "Hello World";

hash<const char*> charPtrHasher;

// This only calculates a hash from the value of the pointer, not from 
// the actual string data! This is why you get a different hash for each.
cout << "Test 1:\n";
cout << charPtrHasher(password1) << endl << charPtrHasher(password2.c_str()) << endl;

hash<std::string> stringHasher;

// This correctly calculates the hash over all characters of the string!
cout << "\nTest 2:\n";
cout << stringHasher(password1) << endl << stringHasher(password2) << endl;