用于unordered_map的std::pair哈希

3

When doing

unordered_map<pair<unsigned int, unsigned int>, unsigned int> m;

我们得到:

错误 C2338:C++标准不为此类型提供哈希。

是否有内置的方法来定义std::pair的哈希,还是我们需要手动定义? (在这种情况下,哈希可以只是将对中第一个项目的字节第二个项目的字节粘合在一起)。

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

注意2:答案 pair<int,int> pair as key of unordered_map issue没有明确回答如何使用两个int创建哈希,如本文详细介绍。


2
如果你问的是它是否是 C++ 标准的一部分,那么不是。 - user2100815
没有“内置的方法”;但是您可以自由定义和实现自己的专业化。 - Sam Varshavchik
1个回答

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;

我不理解对这个答案的负评。并不是必须专门化std::hash;那只是一个选项。 - AndyG
事实上,我建议在这种情况下避免专门化std::hash,因为它影响的代码范围比你的一个用例要大得多。当你是一个用户定义类型的客户端,并且想要哈希该类型时,请不要专门化std::hash;但当你是一个类型的提供者,并且希望每个人都使用一个明智的哈希函数来处理你的类型时,请进行专门化。为标准类型专门化std::hash会增加与其他人的专门化发生冲突并可能违反ODR的机会。 - Chris Uzdavinis

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