unordered_map散列函数c ++

我需要像这样定义一个unordered_map unordered_map<pair<int, int>, *Foo> ,定义和传递一个hashequal函数到这个映射的语法是什么?

我试过传递给它这个对象:

 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作为许多其他事物(如元组和范围)的基础,例如,只要每个成员都可单独哈希,就可以散列整个(有序)容器。

现在你可以声明一个新的地图:

 std::unordered_map<std::pair<int, int>, my_mapped_type> mymap; 

如果你想使用自制软件hasher(它没有很好的统计属性),你必须明确指定模板参数:

 std::unordered_map<std::pair<int,int>, int, pairHash> yourmap; 

请注意,不需要指定散列器对象的副本,因为默认情况下是为您默认构build一个对象。

如果你使用Boost很好,一个更清洁的解决scheme就是依靠Boost的对hash对象的实现(事实上这正是kerrek-sb在他的回答中解释的)。 所以你所要做的就是:

 #include <unordered_map> #include <boost/functional/hash.hpp> using namespace std; using namespace boost; unordered_map<pair<int, int>, int, hash<pair<int, int>>> table; 

散列函数的返回types应该是size_t ,不会long (尽pipe这不是错误的原因)。 您提供自定义哈希函数的语法不正确。

你还需要提供一个相等的谓词来使上述工作正常。

 #include <unordered_map> #include <utility> using namespace std; class pairHash{ public: size_t operator()(const pair<int, int> &k) const{ return k.first * 100 + k.second; } }; struct pairEquals : binary_function<const pair<int,int>&, const pair<int,int>&, bool> { result_type operator()( first_argument_type lhs, second_argument_type rhs ) const { return (lhs.first == rhs.first) && (lhs.second == rhs.second); } }; int main() { unordered_map<pair<int, int>, int, pairHash, pairEquals> myMap; myMap[make_pair(10,20)] = 100; myMap.insert( make_pair(make_pair(100,200), 1000) ); } 

编辑:
你不需要定义相等的谓词,因为operator==是为std::pair定义的,而且它正是我在pairEqualspairEquals 。 如果您希望以不同的方式完成比较,则只需要pairEquals定义。