大小写不敏感的无序字符串映射容器 unordered_map<string, int>

9

我该如何创建一个不区分大小写的unordered_map<string, int>
重载key_equal是否足够,还需要更新hasher吗?

1个回答

3

哈希程序也需要更新,因为默认的哈希算法对于仅在符号大小写不同的字符串无法产生相同的哈希码 - 这是哈希码函数与不区分大小写字符串一起使用的基本属性。

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> 如何处理字符串(我不知道),你的答案可能是错误的! - MBZ
@MBZ 改变 std::hash 对字符串不区分大小写是没有意义的:这样会增加 CPU 的使用成本,并且也会导致更多的哈希冲突。 - Sergey Kalinichenko
在哈希之前,您可以将所有字符串转换为小写。 - aaronman
@aaronman 那样做就失去了意义:OP 不想在哈希映射外部进行操作,他希望映射为他完成操作。 - Sergey Kalinichenko
我的意思是你可以只编写一个包装器。 - aaronman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接