Kullanıcı tanımlı anahtar türlerini desteklemek std::unordered_set<Key>
ve std::unordered_map<Key, Value>
bir sağlamak zorundadır operator==(Key, Key)
ve bir karma funktoru:
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;
Derleyici ve kitaplıkla birlikte gelen türlerde olduğu gibi, yalnızca tür için varsayılan bir hashstd::unordered_set<X>
ile yazmak daha uygun olacaktır . Danıştıktan sonraX
- C ++ Standart Taslak N3242 §20.8.12 [unord.hash] ve §17.6.3.4 [hash.requirements],
- Arttırılmamış
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- Stack Overflow'daki çeşitli ilgili sorular
uzmanlaşmak mümkün görünüyor 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 için derleyici desteği verildiğinde henüz deneysel - Clang'ı denemedim -, bunlar benim sorularım:
Ad alanına böyle bir uzmanlık eklemek yasal mı
std
? Bununla ilgili karışık hislerim var.std::hash<X>::operator()
Varsa sürümlerden hangisi C ++ 11 standardıyla uyumludur?Bunu yapmanın taşınabilir bir yolu var mı?
operator==(const Key, const Key)