Sobes.tech
Back to questions
Junior — Middle
79

Какие условия необходимо соблюсти, чтобы использовать определённый тип в качестве ключа в контейнере std::unordered_map?

Answer from AI

sobes.tech AI

Чтобы использовать определённый тип в качестве ключа в контейнере std::unordered_map в C++, необходимо, чтобы для этого типа были определены:

  1. Хеш-функция — функция, которая принимает ключ и возвращает std::size_t хеш-значение. По умолчанию используется std::hash<T>. Если для вашего типа T нет специализации std::hash, нужно её определить.

  2. Оператор сравнения на равенствоoperator==, который сравнивает два ключа на равенство. Он нужен, чтобы разрешать коллизии хеширования.

Пример для пользовательского типа:

struct Key {
    int id;
    std::string name;

    bool operator==(const Key& other) const {
        return id == other.id && name == other.name;
    }
};

namespace std {
    template<>
    struct hash<Key> {
        std::size_t operator()(const Key& k) const {
            return std::hash<int>()(k.id) ^ (std::hash<std::string>()(k.name) << 1);
        }
    };
}

std::unordered_map<Key, Value> myMap;

Без этих условий компилятор выдаст ошибку при попытке использовать тип в качестве ключа в std::unordered_map.