我需要定义一个像unordered_map<pair<int, int>, *Foo>
这样的unordered_map,用于定义hash
和equal
函数并将其传递给该映射的语法是什么?
我试着传递给这个对象:
class pairHash{
public:
long operator()(const pair<int, int> &k) const{
return k.first * 100 + k.second;
}
};
也没有运气:
unordered_map<pair<int, int>, int> map = unordered_map<pair<int, int>, int>(1,
*(new pairHash()));
我不知道
size_type_Buskets
是什么意思,所以我给了它1
。正确的做法是什么?
谢谢。
最佳答案
这是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
用作其他许多事物的基础,例如元组和范围,因此,例如,只要每个成员都是可单独哈希的,则可以对整个(有序)容器进行哈希处理。现在,您可以声明一个新 map :
std::unordered_map<std::pair<int, int>, my_mapped_type> mymap;
如果要使用自制的哈希器(统计性能不佳),则必须显式指定模板参数:
std::unordered_map<std::pair<int,int>, int, pairHash> yourmap;
请注意,无需指定哈希对象的副本,因为默认情况下将为您默认构造一个哈希对象。
关于c++ - unordered_map哈希函数C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7222143/