HashSet
Рассмотрим HashSet
как HashMap
в
котором мы заботимся только о ключах (в действительности,
HashSet<T>
- это просто адаптер к
HashMap<T, ()>
).
"Какой в этом смысл?", - спросите вы. - "Я бы мог просто хранить
ключи в Vec
."
Уникальная особенность HashSet
в том, что он
гарантирует, что в нём не содержится повторяющихся элементом.
Это условие выполняет любой набор (set). HashSet
-
всего лишь одна реализация (смотрите также:
BTreeSet
).
Если вы вставите значение, которое уже содержится в
HashSet
, (например, новое значение равно
существующему значению и они оба имеют одинаковый хэш), то
новое значение заменит старое.
Это хорошо подходит для случаев, когда вы не хотите иметь в коллекции больше одного "чего-либо" или когда вам необходимо знать имеете ли вы что-либо.
Но наборы могут делать гораздо более.
Наборы имеют 4 основные операции (все вызовы вернут итератор):
-
union
: получить все уникальные элементы из обоих наборов. -
difference
: получить все элементы, представленные в первом наборе, но отсутствующие во втором. -
intersection
: получить только те элементы, которые присутствуют в обоих наборах. -
symmetric_difference
: получить элементы содержащиеся либо только в первом наборе, либо только во втором, но не в обоих (xor).
Попробуем эти методы в следующем примере:
(Пример адаптирован из документации)