Назад к вопросам
Middle
81
questionbank
Что необходимо сделать с классом, чтобы его можно было использовать в качестве ключа в std::map или std::unordered_map?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Чтобы класс MyClass можно было использовать как ключ в std::map<MyClass, ValueType> и std::unordered_map<MyClass, ValueType>, необходимо:
Для std::map:
-
Определить оператор
<как нестатический член или свободную функцию.#include <string> class MyClass { public: int id; std::string name; // Оператор < для std::map bool operator<(const MyClass& other) const { if (id != other.id) { return id < other.id; } return name < other.name; } };
Для std::unordered_map:
-
Определить функтор хеширования (hash function) для
MyClass. -
Определить оператор
==для сравнения на равенство.#include <functional> // Для std::hash #include <string> class MyClass { public: int id; std::string name; // Оператор == для std::unordered_map bool operator==(const MyClass& other) const { return id == other.id && name == other.name; } }; // Специализация std::hash для MyClass // Это внешний функтор хеширования namespace std { template <> struct hash<MyClass> { size_t operator()(const MyClass& obj) const { // Комбинируем хеши полей size_t h1 = hash<int>{}(obj.id); size_t h2 = hash<std::string>{}(obj.name); // Простой способ комбинирования // Более сложные методы могут обеспечить лучшую производительность return h1 ^ (h2 << 1); } }; }
Сводная таблица требований:
| Требование | std::map |
std::unordered_map |
Примечание |
|---|---|---|---|
Оператор < |
✔ | ✘ | Для упорядочивания |
Оператор == |
✘ | ✔ | Для сравнения на равенство |
| Функтор хеширования | ✘ | ✔ | Для вычисления хеша ключа |