Sobes.tech
Junior — Middle
96

Какие специальные предикаты необходимо определить для использования пользовательских типов в std::unordered_map?

Companies where asked
Телкор

Answer from AI

sobes.tech AI

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

  1. Хеш-функцию — объект или функцию, которая принимает ключ и возвращает его хеш (целочисленное значение). Обычно это делается через специализацию шаблона std::hash для вашего типа или через передачу собственного хеш-функтора в качестве параметра шаблона.

  2. Оператор сравнения равенства — должен быть определён оператор operator== для вашего типа, чтобы unordered_map мог сравнивать ключи и определять, равны ли они.

Пример:

#include <unordered_map>
#include <string>

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> {
        size_t operator()(const Key& k) const {
            return hash<int>()(k.id) ^ (hash<std::string>()(k.name) << 1);
        }
    };
}

int main() {
    std::unordered_map<Key, int> map;
    map[{1, "test"}] = 42;
}

Без этих определений std::unordered_map не сможет корректно хранить и искать элементы по ключам пользовательского типа.