Back to questions
Junior — Middle
79
Какие условия необходимо соблюсти, чтобы использовать определённый тип в качестве ключа в контейнере std::unordered_map?
Answer from AI
sobes.tech AI
Чтобы использовать определённый тип в качестве ключа в контейнере std::unordered_map в C++, необходимо, чтобы для этого типа были определены:
-
Хеш-функция — функция, которая принимает ключ и возвращает
std::size_tхеш-значение. По умолчанию используетсяstd::hash<T>. Если для вашего типаTнет специализацииstd::hash, нужно её определить. -
Оператор сравнения на равенство —
operator==, который сравнивает два ключа на равенство. Он нужен, чтобы разрешать коллизии хеширования.
Пример для пользовательского типа:
struct Key {
int id;
std::string name;
bool operator==(const Key& other) const {
return id == other.id && name == other.name;
}
};
namespace std {
template<>
struct hash<Key> {
std::size_t operator()(const Key& k) const {
return std::hash<int>()(k.id) ^ (std::hash<std::string>()(k.name) << 1);
}
};
}
std::unordered_map<Key, Value> myMap;
Без этих условий компилятор выдаст ошибку при попытке использовать тип в качестве ключа в std::unordered_map.