Назад к вопросам
Middle
296
questionbank
Что необходимо сделать, чтобы использовать класс в качестве ключа в unordered_map?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для использования пользовательского класса в качестве ключа в std::unordered_map необходимо:
- Перегрузить оператор сравнения на равенство (
operator==) для вашего класса.unordered_mapиспользует его для определения идентичности ключей. - Предоставить хеш-функцию для вашего класса. Это может быть сделано одним из следующих способов:
- Специализация шаблонной структуры
std::hashдля вашего класса. - Передача объекта хеш-функции в качестве третьего аргумента конструктора
std::unordered_map.
- Специализация шаблонной структуры
Пример специализации std::hash:
#include <functional>
struct MyClass {
int id;
std::string name;
// operator== required
bool operator==(const MyClass& other) const {
return id == other.id && name == other.name;
}
};
// Specialization of std::hash for MyClass
namespace std {
template <>
struct hash<MyClass> {
size_t operator()(const MyClass& obj) const {
// Combine hashes of members
return std::hash<int>()(obj.id) ^ (std::hash<std::string>()(obj.name) << 1);
}
};
}
Пример передачи функтора хеширования в конструктор:
#include <functional>
#include <unordered_map>
struct MyClass {
int id;
std::string name;
bool operator==(const MyClass& other) const {
return id == other.id && name == other.name;
}
};
struct MyClassHasher {
size_t operator()(const MyClass& obj) const {
return std::hash<int>()(obj.id) ^ (std::hash<std::string>()(obj.name) << 1);
}
};
// Usage
std::unordered_map<MyClass, int, MyClassHasher> myMap;
Важно, чтобы хеш-функция была детерминированной (всегда возвращала один и тот же хеш для одного и того же объекта) и обеспечивала хорошее распределение хешей для минимизации коллизий.