std::unordered_set
Определён в заголовочном файле <unordered_set> | ||
|---|---|---|
template<
class Key,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator<Key>
> class unordered_set;
| (1) | (начиная с C++11) |
namespace pmr {
template<
class Key,
class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>
> using unordered_set = std::unordered_set<Key, Hash, Pred,
std::pmr::polymorphic_allocator<Key>>;
}
| (2) | (начиная с C++17) |
std::unordered_set — это ассоциативный контейнер, содержащий набор уникальных объектов типа Key. Поиск, вставка и удаление имеют среднюю постоянную временную сложность.
Внутри контейнера элементы не отсортированы в каком-либо определённом порядке, а сгруппированы по корзинам. Корзина, в которую помещается элемент, полностью зависит от хеш-значения этого элемента. Благодаря этому обеспечивается быстрый доступ к отдельным элементам: после вычисления хеш-значения оно указывает на конкретную корзину, в которую помещён элемент.
Элементы контейнера нельзя изменять (даже с помощью неконстантных итераторов), поскольку изменение элемента может изменить его хеш-значение и повредить контейнер.
std::unordered_set соответствует требованиям Container, AllocatorAwareContainer, UnorderedAssociativeContainer.
| Все функции-члены Однако определение переменной | (начиная с C++26) |
Инвалидация итераторов
| Операции | Инвалидация |
|---|---|
Все операции только для чтения, swap, std::swap | Никогда |
clear, rehash, reserve, operator= | Всегда |
insert, emplace, emplace_hint | Только если вызывает перехеширование |
erase | Только для удалённого элемента |
Примечания
- Функции обмена не инвалидируют итераторы внутри контейнера, но инвалидируют итератор, указывающий на конец области обмена.
- Ссылки и указатели на данные, хранящиеся в контейнере, инвалидируются только при удалении соответствующего элемента, даже если соответствующий итератор инвалидирован.
- После перемещающего присваивания контейнера, если только поэлементное перемещающее присваивание не было вызвано несовместимыми аллокаторами, ссылки, указатели и итераторы (кроме итератора за последним элементом) контейнера-источника остаются действительными, но указывают на элементы, которые теперь находятся в
*this.
Параметры шаблона
Типы-члены
| Тип | Определение |
|---|---|
key_type |
Key |
value_type |
Key |
size_type | беззнаковый целочисленный тип (обычно std::size_t) |
difference_type | знаковый целочисленный тип (обычно std::ptrdiff_t) |
hasher |
Hash |
key_equal |
KeyEqual |
allocator_type |
Allocator |
reference | value_type& |
const_reference | constvalue_type& |
pointer | std::allocator_traits<Allocator>::pointer |
const_pointer | std::allocator_traits<Allocator>::const_pointer |
iterator | Константный LegacyForwardIterator и ConstexprIterator(начиная с C++26) для value_type |
const_iterator | LegacyForwardIterator и ConstexprIterator(начиная с C++26) для constvalue_type |
local_iterator | тип итератора, категория, тип значения, тип разности, тип указателя и тип ссылки которого совпадают с iterator. Этот итераторможно использовать для обхода одной корзины, но не для перехода между корзинами |
const_local_iterator | тип итератора, категория, тип значения, тип разности, тип указателя и тип ссылки которого совпадают с const_iterator. Этот итераторможно использовать для обхода одной корзины, но не для перехода между корзинами |
node_type (начиная с C++17) | специализация дескриптора узла, представляющая узел контейнера |
insert_return_type (начиная с C++17) | тип, описывающий результат вставки node_type, специализация template< class Iter, class NodeType >
struct /* unspecified */
{
Iter position;
bool inserted;
NodeType node;
};
с параметрами шаблона |
Функции-члены
создаёт unordered_set (публичная функция-член) |
|
уничтожает unordered_set (публичная функция-член) |
|
| присваивает контейнеру значения (публичная функция-член) |
|
| возвращает связанный аллокатор (публичная функция-член) |
|
Итераторы |
|
| возвращает итератор на начало (публичная функция-член) |
|
| возвращает итератор на конец (публичная функция-член) |
|
Ёмкость |
|
| проверяет, пуст ли контейнер (публичная функция-член) |
|
| возвращает количество элементов (публичная функция-член) |
|
| возвращает максимально возможное количество элементов (публичная функция-член) |
|
Модификаторы |
|
| очищает содержимое (публичная функция-член) |
|
| вставляет элементы или узлы(начиная с C++17) (публичная функция-член) |
|
|
(C++23) | вставляет диапазон элементов (публичная функция-член) |
| создаёт элемент на месте (публичная функция-член) |
|
| создаёт элементы на месте, используя подсказку (публичная функция-член) |
|
| удаляет элементы (публичная функция-член) |
|
| обменивает содержимое (публичная функция-член) |
|
|
(C++17) | извлекает узлы из контейнера (публичная функция-член) |
|
(C++17) | переносит узлы из другого контейнера (публичная функция-член) |
Поиск |
|
| возвращает количество элементов, соответствующих заданному ключу (публичная функция-член) |
|
| находит элемент с заданным ключом (публичная функция-член) |
|
|
(C++20) | проверяет, содержит ли контейнер элемент с заданным ключом (публичная функция-член) |
| возвращает диапазон элементов, соответствующих заданному ключу (публичная функция-член) |
|
Интерфейс корзин |
|
| возвращает итератор на начало указанной корзины (публичная функция-член) |
|
| возвращает итератор на конец указанной корзины (публичная функция-член) |
|
| возвращает количество корзин (публичная функция-член) |
|
| возвращает максимальное количество корзин (публичная функция-член) |
|
| возвращает количество элементов в заданной корзине (публичная функция-член) |
|
| возвращает корзину для заданного ключа (публичная функция-член) |
|
Политика хеширования |
|
| возвращает среднее количество элементов в одной корзине (публичная функция-член) |
|
| управляет максимальным средним количеством элементов в одной корзине (публичная функция-член) |
|
| резервирует не меньше указанного количества корзин и перестраивает хеш-таблицу (публичная функция-член) |
|
| резервирует место как минимум для указанного количества элементов и перестраивает хеш-таблицу (публичная функция-член) |
|
Функции-наблюдатели |
|
| возвращает функцию, используемую для хеширования ключей (публичная функция-член) |
|
| возвращает функцию, используемую для сравнения ключей на равенство (публичная функция-член) |
|
Нефункции-члены
|
(C++11)(C++11)(удалён в C++20) | сравнивает значения в unordered_set (шаблон функции) |
|
(C++11) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++20) | удаляет все элементы, удовлетворяющие заданному условию (шаблон функции) |
Вывод аргументов шаблона | (начиная с C++17) |
Примечания
Типы-члены iterator и const_iterator могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти два типа в качестве типов параметров, может нарушить правило одного определения. Поскольку iterator преобразуется в const_iterator, вместо этого можно использовать одну функцию с const_iterator в качестве типа параметра.
| Макрос проверки наличия функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_containers_ranges | 202202L | (C++23) | Создание и вставка контейнеров с использованием диапазонов |
__cpp_lib_constexpr_unordered_set | 202502L | (C++26) | Constexpr std::unordered_set |
Пример
#include <iostream>
#include <unordered_set>
void print(const auto& set)
{
for (const auto& elem : set)
std::cout << elem << ' ';
std::cout << '\n';
}
int main()
{
std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // creates a set of ints
print(mySet);
mySet.insert(5); // puts an element 5 in the set
print(mySet);
if (auto iter = mySet.find(5); iter != mySet.end())
mySet.erase(iter); // removes an element pointed to by iter
print(mySet);
mySet.erase(7); // removes an element 7
print(mySet);
}
Возможный вывод:
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 2050 | C++11 | определения reference, const_reference, pointerи const_pointer основывались на allocator_type | основываются на value_type иstd::allocator_traits |
См. также
|
(C++11) | набор ключей с хешированием по ключам (шаблон класса) |
| набор уникальных ключей, отсортированных по ключам (шаблон класса) |
|
|
(C++23) | адаптирует контейнер для хранения набора уникальных ключей, отсортированных по ключам (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_set