最佳答案
支持 std::unordered_set<Key>
和 std::unordered_map<Key, Value>
中用户定义的键类型
必须提供 operator==(Key, Key)
和散列函数:
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
只写 std::unordered_set<X>
会更方便
X
型的 默认哈希,
类似于随编译器和库而来的类型。
在咨询之后
include\c++\4.7.0\bits\functional_hash.h
include\xfunctional
似乎可以将 std::hash<X>::operator()
专门化:
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
考虑到 C + + 11的编译器支持还处于试验阶段——-我没有尝试 Clang ——-,这是我的问题:
在名称空间 std
中添加这样的专门化是合法的吗。
哪个 std::hash<X>::operator()
版本(如果有的话)符合 C + + 11标准?
有便携式的方法吗?