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

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

Sobes Copilot

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

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

sobes.tech AI

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

  1. Реализовать оператор == для сравнения экземпляров вашего класса на равенство. unordered_map использует его для проверки на наличие ключа.
  2. Реализовать хэш-функцию для вашего класса. 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;
}