でユーザー定義のキータイプをサポート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
- C++標準ドラフトN3242§20.8.12 [unord.hash]および§17.6.3.4[hash.requirements]、
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- StackOverflowのさまざまな関連質問
専門化することは可能のようです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標準に準拠しているバージョンはどれですか?それを行うためのポータブルな方法はありますか?