【发布时间】:2013-08-05 00:22:35
【问题描述】:
如何创建不区分大小写的unordered_map<string, int>?
覆盖key_equal 是否足够,或者我还需要更新hasher?
【问题讨论】:
标签: c++ string stl std unordered-map
如何创建不区分大小写的unordered_map<string, int>?
覆盖key_equal 是否足够,或者我还需要更新hasher?
【问题讨论】:
标签: c++ string stl std unordered-map
Hasher 也需要更新,因为默认哈希算法 does not produce identical hash code for strings that differ only in the case of their symbols - 哈希码函数的基本属性,旨在处理不区分大小写的字符串。
std::string s1 = "Hello";
std::string s2 = "hello";
std::hash<std::string> hash_fn;
size_t hash1 = hash_fn(s1);
size_t hash2 = hash_fn(s2);
std::cout << hash1 << '\n';
std::cout << hash2 << '\n';
这在 ideone 上显示了不同的值:
101669370
3305111549
【讨论】:
std::hash<Key> 函数。所以你的答案可能是错误的,这取决于std::hash<Key> 如何处理字符串(我不知道)!
std::hash 更改为 strings 以不注意字符大小写是没有意义的:该函数在 CPU 使用方面会更加昂贵,并且会导致还有更多的碰撞。