【问题标题】:case insensitive unordered_map<string, int>不区分大小写 unordered_map<string, int>
【发布时间】:2013-08-05 00:22:35
【问题描述】:

如何创建不区分大小写的unordered_map&lt;string, int&gt;
覆盖key_equal 是否足够,或者我还需要更新hasher

【问题讨论】:

    标签: c++ string stl std unordered-map


    【解决方案1】:

    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&lt;Key&gt; 函数。所以你的答案可能是错误的,这取决于std::hash&lt;Key&gt; 如何处理字符串(我不知道)!
    • @MBZ 将 std::hash 更改为 strings 以不注意字符大小写是没有意义的:该函数在 CPU 使用方面会更加昂贵,并且会导致还有更多的碰撞。
    • 你可以在散列之前将所有字符串变成小写
    • @aaronman 这会破坏目的:OP 不想在哈希映射外部执行此操作,他希望映射为他执行此操作。
    • 我的意思是你可以写一个包装器
    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2012-12-01
    • 2013-03-06
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多