Большинство компиляторов должны определять std::hash_map
для вас; в следующем стандарте C++0x
он будет частью стандартной библиотеки как std::unordered_map
. Страница STL на ней довольно стандартная. Если вы используете Visual Studio, на странице 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;
После этого все должно работать как положено.