std::pair 的哈希值,用于 unordered_map

Bas*_*asj 3 c++ dictionary unordered-map hashmap std-pair

做的时候

unordered_map<pair<unsigned int, unsigned int>, unsigned int> m;
Run Code Online (Sandbox Code Playgroud)

我们得到

错误 C2338:C++ 标准未提供此类型的哈希值。

是否有内置的方法来定义 of 的哈希值std::pairint或者我们需要手动定义它?(在这种情况下,散列可以只是(第一项的字节)(该对的第二项的字节)粘合在一起)。

注意:我使用的是 VC++ 2013。

注意2: pair<int,int>pair作为unordered_map问题的关键的答案并没有清楚地解决如何实际创建具有两个ints的散列的问题,如此处详述。

Chr*_*nis 5

如果您不想使用 boost,那么自己动手应该不会太难。添加 static_assert 是为了确保维持 2 个 int 适合 1 个 size_t 的假设。

using IntPair = std::pair<int, int>;

struct IntPairHash {
    static_assert(sizeof(int) * 2 == sizeof(size_t));

    size_t operator()(IntPair p) const noexcept {
        return size_t(p.first) << 32 | p.second;
    }
};

std::unordered_map<IntPair, int, IntPairHash> myMap;
Run Code Online (Sandbox Code Playgroud)