这是 C++11 中的一个不幸的遗漏; Boost 给出了答案hash_combine
。请随意粘贴它们!这是我散列对的方式:
template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std
{
template<typename S, typename T> struct hash<pair<S, T>>
{
inline size_t operator()(const pair<S, T> & v) const
{
size_t seed = 0;
::hash_combine(seed, v.first);
::hash_combine(seed, v.second);
return seed;
}
};
}
您可以使用hash_combine
作为许多其他事物(如元组和范围)的基础,因此您可以对整个(有序)容器进行哈希处理,例如,只要每个成员都是可单独哈希的。
现在你可以声明一个新地图:
std::unordered_map<std::pair<int, int>, my_mapped_type> mymap;
如果您想使用自制哈希器(它没有良好的统计属性),您必须明确指定模板参数:
std::unordered_map<std::pair<int,int>, int, pairHash> yourmap;
请注意,无需指定哈希器对象的副本,因为默认情况下会为您默认构建一个。