Для підтримки ключових типів , визначених користувачем в 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],
- Підвищення
- г ++
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?Чи є портативний спосіб це зробити?
std::hash
(на відміну від інших речей у std
просторі імен) не перешкоджає посібнику зі стилів Google ; візьміть його з зерном солі.
operator==(const Key, const Key)