【问题标题】:Why can't I use pair as key of unordered_set / unordered_map? [duplicate]为什么我不能使用 pair 作为 unordered_set / unordered_map 的键? [复制]
【发布时间】:2015-08-05 19:59:41
【问题描述】:

std::set<> 和 std::map<> 都可以使用 std::pair 作为键,但为什么不能使用 std::unordered_set<> 和 std::unordered_map<>?

例如:

unordered_set<pair<int,int> > S;
S.insert(make_pair(0, 1));

不编译。

【问题讨论】:

    标签: c++ dictionary set unordered-map unordered-set


    【解决方案1】:

    unordered_* 容器需要一个哈希函数。默认情况下,它们使用std::hash,但标准库中没有为std::pair&lt;T1,T2&gt; 提供std::hash 的特化。另一方面,有序容器依赖于std::less(默认情况下)并且std::pair确实提供了operator&lt;。这就是它起作用的原因。

    为了拥有一个带有pair 的无序容器,您必须自己提供一个哈希函子。例如:

    struct SimpleHash {
        size_t operator()(const std::pair<int, int>& p) const {
            return p.first ^ p.second;
        }
    };
    
    std::unordered_set<std::pair<int, int>, SimpleHash> S;
    S.insert(std::make_pair(0, 1));
    

    【讨论】:

    • S.emplace(... 也可以工作,如果不行,你会改变什么?
    • @Barry 可以 p.first ^ p.second 为 p_a 和 p_b 等不同的对获得相同的值吗?
    • @olivia 当然。对于(a,b) 和(b,a),它肯定会为您提供相同的值。它不是一个完美的哈希函数,只是一个简单的例子。
    【解决方案2】:

    您需要为pair提供一个哈希函数。

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多