Назад к вопросам
Middle
89
questionbank
Что необходимо сделать для того, чтобы использовать класс в качестве ключа в unordered_map?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для использования класса в качестве ключа в std::unordered_map необходимо:
- Реализовать оператор
==для сравнения экземпляров вашего класса на равенство.unordered_mapиспользует его для проверки на наличие ключа. - Реализовать хэш-функцию для вашего класса.
unordered_mapиспользует ее для вычисления хэша ключа и определения корзины, в которую поместить элемент. Стандартная библиотека предоставляетstd::hashдля базовых типов. Для пользовательских классов можно либо перегрузить шаблонstd::hash, либо предоставить собственную функцию/функитор и передать ее как третий аргумент шаблонаunordered_map.
Пример:
#include <unordered_map>
#include <string>
#include <functional>
// Пользовательский класс
struct MyKey {
int id;
std::string name;
// Перегрузка оператора ==
bool operator==(const MyKey& other) const {
return id == other.id && name == other.name;
}
};
// Специализация std::hash для MyKey
namespace std {
template <>
struct hash<MyKey>
{
std::size_t operator()(const MyKey& key) const
{
// Комбинируем хэши полей
return std::hash<int>()(key.id) ^ (std::hash<std::string>()(key.name) << 1);
}
};
}
int main() {
// Использование MyKey в качестве ключа
std::unordered_map<MyKey, int> myMap;
MyKey key1 = {1, "Test1"};
MyKey key2 = {2, "Test2"};
myMap[key1] = 10;
myMap[key2] = 20;
return 0;
}