Ответ 1
Большинство компиляторов должны определить std::hash_map
для вас; в следующем стандарте C++0x
он будет частью стандартной библиотеки как std::unordered_map
. Страница Microsoft имеет страницу на нем.
Если вы хотите использовать свой класс как значение, а не как ключ, то вам не нужно ничего делать. Все примитивные типы (например, int
, char
, bool
и даже char *
) должны "просто работать" как клавиши в hash_map
. Однако для чего-либо еще вам нужно будет определить свои собственные функции хеширования и равенства, а затем написать "функторы", которые завершают их в классе.
Предполагая, что ваш класс называется MyClass
, и вы уже определили:
size_t MyClass::HashValue() const { /* something */ }
bool MyClass::Equals(const MyClass& other) const { /* something */ }
Вам нужно будет определить два функтора, чтобы обернуть эти методы в объекты.
struct MyClassHash {
size_t operator()(const MyClass& p) const {
return p.HashValue();
}
};
struct MyClassEqual {
bool operator()(const MyClass& c1, const MyClass& c2) const {
return c1.Equals(c2);
}
};
И создайте экземпляр hash_map
/hash_set
как:
hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map;
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set;
После этого все должно работать как ожидается.