unordered_map散列函数c ++
我需要像这样定义一个unordered_map unordered_map<pair<int, int>, *Foo>
,定义和传递一个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
作为许多其他事物(如元组和范围)的基础,例如,只要每个成员都可单独哈希,就可以散列整个(有序)容器。
现在你可以声明一个新的地图:
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
定义的,而且它正是我在pairEquals
中pairEquals
。 如果您希望以不同的方式完成比较,则只需要pairEquals
定义。