Как использовать свои структуры данных в качестве ключей в map?

Для std::map ключ должен сравниваться отношением строгого слабого порядка. Задайте operator< или отдельный comparator; для unordered_map нужны хеш и согласованное равенство.

Короткий ответ

Что ответить на собеседовании

Для std::map ключ должен сравниваться отношением строгого слабого порядка. Задайте operator< или отдельный comparator; для unordered_map нужны хеш и согласованное равенство.

Подробный разбор

Ответ с пояснениями

Для std::map ключ должен сравниваться отношением строгого слабого порядка. Задайте operator< или отдельный comparator; для unordered_map нужны хеш и согласованное равенство.

Пример для упорядоченного контейнера:

#include <map>
#include <tuple>

struct Key { int group; int id; };
struct Less {
    bool operator()(const Key& a, const Key& b) const {
        return std::tie(a.group, a.id) < std::tie(b.group, b.id);
    }
};
std::map<Key, int, Less> values;

Эквивалентность в map определяется как !less(a,b) && !less(b,a), а не обязательно operator==. Ключ нельзя менять так, чтобы порядок нарушился, пока он находится в контейнере. Для unordered_map равные ключи обязаны иметь равные хеши; один хороший хеш без корректного сравнения недостаточен.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее