Назад к вопросам
Middle
295
questionbank

Что необходимо сделать, чтобы использовать класс в качестве ключа в unordered_map?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Для использования пользовательского класса в качестве ключа в std::unordered_map необходимо:

  1. Перегрузить оператор сравнения на равенство (operator==) для вашего класса. unordered_map использует его для определения идентичности ключей.
  2. Предоставить хеш-функцию для вашего класса. Это может быть сделано одним из следующих способов:
    • Специализация шаблонной структуры 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;

Важно, чтобы хеш-функция была детерминированной (всегда возвращала один и тот же хеш для одного и того же объекта) и обеспечивала хорошее распределение хешей для минимизации коллизий.