Untuk mendukung jenis kunci yang ditentukan pengguna std::unordered_set<Key>
dan std::unordered_map<Key, Value>
harus menyediakan operator==(Key, Key)
dan fungsi hash:
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;
Akan lebih mudah untuk menulis hanya std::unordered_set<X>
dengan hash default untuk tipe X
, seperti untuk tipe yang disertakan dengan kompilator dan pustaka. Setelah berkonsultasi
- C ++ Standard Draft N3242 §20.8.12 [unord.hash] dan §17.6.3.4 [hash.requirements],
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- berbagai pertanyaan terkait di Stack Overflow
tampaknya mungkin untuk mengkhususkan 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
}
Mengingat dukungan compiler untuk C ++ 11 masih bersifat eksperimental --- Saya tidak mencoba Clang ---, ini adalah pertanyaan saya:
Apakah legal menambahkan spesialisasi seperti itu ke namespace
std
? Saya memiliki perasaan campur aduk tentang itu.std::hash<X>::operator()
Versi manakah , jika ada, yang sesuai dengan standar C ++ 11?Apakah ada cara portabel untuk melakukannya?
std::hash
(tidak seperti hal lain dalam std
namespace) tidak disarankan oleh panduan gaya Google ; ambillah dengan sebutir garam.
operator==(const Key, const Key)