Wspieranie zdefiniowane przez użytkownika kluczowe typy w std::unordered_set<Key>
i std::unordered_map<Key, Value>
jeden musi zapewnić operator==(Key, Key)
a funktor hash:Jak specjalizować std :: hash <Key> :: operator() dla typu zdefiniowanego przez użytkownika w nieuporządkowanych kontenerach?
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;
Byłoby wygodniej pisać tylko std::unordered_set<X>
z domyślnej hash na typ X
, podobne do typów pochodzących z kompilatora i biblioteki. po konsultacji
- C++ standardowe Draft N3242 §20.8.12 [unord.hash] i §17.6.3.4 [hash.requirements]
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- różne related question s w przepełnieniu stosu
it se EMS można specjalizować 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
}
Biorąc pod uwagę wsparcie dla C++ kompilator 11 jest jeszcze eksperymentalny --- ja nie spróbować dzyń --- są to moje pytania:
Czy go prawnych, aby dodać taką specjalizację do przestrzeni nazw
std
? Mam mieszane uczucia na ten temat.Która z wersji, jeśli jest, jest zgodna ze standardem C++ 11?
Czy istnieje przenośny sposób na zrobienie tego?
z GCC 4.7.2, musiałem dostarczyć globalnego operatora == (const const klucz, klucz) ' –