【问题标题】:Why map<pair<int,int>, int> works, but unordered_map<pair<int,int>> doesn't?为什么 map<pair<int,int>, int> 有效,但 unordered_map<pair<int,int>> 无效?
【发布时间】:2021-11-18 14:37:25
【问题描述】:

map&lt;pair&lt;int,int&gt;, int&gt; 可以编译,但 unordered_map&lt;pair&lt;int,int&gt;&gt; 存在哈希函数问题。背后到底发生了什么?

【问题讨论】:

标签: c++ hash unordered-map


【解决方案1】:

std::map&lt;Key,T&gt; 要求密钥类型是可比较的。 std::map&lt;Key,T&gt; 的默认比较器是 std::less&lt;Key&gt;,因此您可以将其与 std::pair&lt;T1,T2&gt; 一起使用,因为 std::pair 定义了 operator&lt;(或 operator&lt;=&gt;,具体取决于您的 C++ 版本),使其具有可比性。由于地图是有序的,它必须能够比较键以了解如何在内部对它们进行排序,并且它使用比较器来做到这一点。

另一方面,std::unordered_map&lt;Key,T&gt; 需要与 Key 类型不同的两个方面,它必须是可散列的,并且还必须具有可比性以实现相等。 std::pair&lt;T1,T2&gt; 确实实现了 operator==/operator&lt;=&gt; 但仅此还不足以使该类型可用作 Key 类型。标准库没有为std::pair 提供std::hash 的特化,因此它不会编译(但是,boost does,它只是结合了.first.second 的哈希)。

如果愿意,您可以使用std::unordered_map&lt;std::pair&lt;int, int&gt;, ...&gt;,但您需要提供自己的函数来散列此类型,方法是定义一个函子作为模板参数传递给std::unordered_map&lt;&gt;,或者定义您自己的@ 自定义特化987654347@直接。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2014-09-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多