Есть причина, по которой хеш отсутствует unordered_set
. По умолчанию unordered_set
является изменчивой последовательностью. Хэш должен иметь такое же значение, пока объект находится в unordered_set
. Таким образом, ваши элементы должны быть неизменными. Это не гарантируется с помощью модификатора const&
, так как это только гарантирует, что только основной unordered_set
и его методы не изменят sub- unordered_set
. Не использовать ссылку может быть безопасное решение (вам все равно придется писать хеш-функцию), но действительно ли вам нужны накладные расходы на перемещение / копирование unordered_set
s?
Вместо этого вы можете использовать какой-то вид указателя. Это отлично; указатель - это только адрес памяти, и ваш unordered_set
сам не перемещается (он может перераспределить свой пул элементов, но кому это нужно?). Поэтому ваш указатель является постоянным, и он может удерживать один и тот же хэш для своего времени жизни в unordered_set
. ( EDIT : как указал Говард, вы должны убедиться, что любой элемент вашего заказа хранится для вашего набора, если два набора имеют одинаковые элементы, они считаются равными. Выполняя заказ в том, как вы храните свой целые числа, вы легко получаете, что два набора соответствуют двум равным векторам.)
В качестве бонуса теперь вы можете использовать интеллектуальный указатель внутри самого основного набора для управления памятью sub- unordered_set
, если вы
Обратите внимание, что это еще не самая эффективная реализация, чтобы получить набор наборов int. Чтобы сделать вас подмножествами, вы можете написать краткую обертку вокруг std::vector
, которая хранит int, упорядоченную по значению. int
int являются малыми и дешевыми для сравнения, а использование дихотомического поиска является только O(log n)
по сложности. A std::unordered_set
- это тяжелая структура и то, что вы теряете, перейдя от O(1)
до O(log n)
, вы получите его обратно, имея компактную память для каждого набора. Это не должно быть слишком сложно реализовать, но почти гарантированно будет лучше в производительности.
Более сложное решение будет включать в себя trie .