Для set требуется строгий слабый порядок, для unordered_set — равенство и согласованный с ним хеш. Для Data с единственным int все три операции естественно определяются через value.
Использование структуры Data в качестве ключа для std::set и std::unordered_set
Для 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 хранящегося ключа в обход правил контейнера.