【发布时间】:2017-05-03 00:16:57
【问题描述】:
我以前从未研究过散列算法,我很惊讶在使用 std::unordered_map 时发现散列函数(我认为)实际上是散列内存地址,而不是字符串。如果我错了,请纠正我,但我只是通过更改原始字符串并将其添加到我的 unordered_map 中发现了这一点,并且当内存地址(指针)相同时,它从未添加任何内容。
并且在以下情况下是否添加新键取决于std::string是否重新分配到另一个内存区域:
std::unordered_map<const char*, char*> myMap;
std::string myString = "Key1";
myMap[myString.c_str()] = "someVal"; // <--- Adds a new key, size is now 1
myString = "Key2";
myMap[myString.c_str()] = "someVal"; // <--- Doesn't add a new key "Key2" didn't need to be reallocated
但是,当我更改字符串时直接在模板中使用 std::string 时,它确实向我的地图添加了另一个键,所以这表明 unordered_map 模板专门用于 std::string 并且实际上对字符串本身进行哈希处理?如果必须对字符串本身进行哈希处理,这种方式会不会更慢?
我提出这个问题的原因是,我看到的教程似乎传达了这样的意思,即被散列的实际字符串本身。即使在 Stack Overflow 上,我也看到人们出于性能原因说(解释)“不需要检查整个字符串,只需要检查尽可能多的字符”。
我得到的印象对于字符串文字和指向字符串的指针显然是错误的,但对于 std::string 类却不是?
【问题讨论】:
-
char*不是字符串。
标签: c++ string dictionary hash std