Использование структуры Data в качестве ключа для std::set и std::unordered_set

Для set требуется строгий слабый порядок, для unordered_set — равенство и согласованный с ним хеш. Для Data с единственным int все три операции естественно определяются через value.

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

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

Для set требуется строгий слабый порядок, для unordered_set — равенство и согласованный с ним хеш. Для Data с единственным int все три операции естественно определяются через value.

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

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

Условие

Необходимо сделать так, чтобы пользовательская структура Data могла выступать в роли ключа как в упорядоченном контейнере std::set, так и в неупорядоченном std::unordered_set. Для этого следует реализовать требуемые операторы сравнения и функцию хеширования, после чего пример кода будет успешно компилироваться и работать.

#include <set>
#include <iostream>
#include <unordered_set>

struct Data {
    int value;
};

int main(int argc, char** argv)
{
    std::set<Data> dataSet;
    std::unordered_set<Data> dataUSet;
    return EXIT_SUCCESS;
}

Ответ

Для set требуется строгий слабый порядок, для unordered_set — равенство и согласованный с ним хеш. Для Data с единственным int все три операции естественно определяются через value.

#include <functional>

struct Data {
    int value;
    bool operator<(const Data& other) const noexcept {
        return value < other.value;
    }
    bool operator==(const Data& other) const noexcept {
        return value == other.value;
    }
};

template<>
struct std::hash<Data> {
    std::size_t operator()(const Data& data) const noexcept {
        return std::hash<int>{}(data.value);
    }
};

Специализацию разместите до первого использования unordered_set<Data>. Равные ключи обязаны иметь одинаковый хеш; разные ключи могут иметь одинаковый. Нельзя менять value хранящегося ключа в обход правил контейнера.

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

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

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

Подробнее