で、ユーザー定義のキータイプをサポートするために、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;
コンパイラとライブラリに付属する型の場合のように、typeのデフォルトのハッシュだけ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
- スタックオーバーフローのさまざまな関連質問
専門化することは可能であるようです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標準に準拠しているバージョンがある場合、それはどれですか。それを行うためのポータブルな方法はありますか?
operator==(const Key, const Key)