Spec-Zone.ru › C++

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.

Все функции-члены std::unordered_set являются constexpr: объекты std::unordered_set можно создавать и использовать при вычислении константного выражения.

Однако определение переменной std::unordered_set с constexpr обычно приводит к ошибке, поскольку вычисление константного выражения требует, чтобы любое динамически выделенное хранилище освобождалось в рамках того же вычисления, чего обычно не происходит при инициализации std::unordered_set.

(начиная с 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;
};

с параметрами шаблона iterator и node_type.

Функции-члены

(конструктор)
создаёт unordered_set
(публичная функция-член)
(деструктор)
уничтожает unordered_set
(публичная функция-член)
operator=
присваивает контейнеру значения
(публичная функция-член)
get_allocator
возвращает связанный аллокатор
(публичная функция-член)
Итераторы
begincbegin
возвращает итератор на начало
(публичная функция-член)
endcend
возвращает итератор на конец
(публичная функция-член)
Ёмкость
empty
проверяет, пуст ли контейнер
(публичная функция-член)
size
возвращает количество элементов
(публичная функция-член)
max_size
возвращает максимально возможное количество элементов
(публичная функция-член)
Модификаторы
clear
очищает содержимое
(публичная функция-член)
insert
вставляет элементы или узлы(начиная с C++17)
(публичная функция-член)
insert_range
(C++23)
вставляет диапазон элементов
(публичная функция-член)
emplace
создаёт элемент на месте
(публичная функция-член)
emplace_hint
создаёт элементы на месте, используя подсказку
(публичная функция-член)
erase
удаляет элементы
(публичная функция-член)
swap
обменивает содержимое
(публичная функция-член)
extract
(C++17)
извлекает узлы из контейнера
(публичная функция-член)
merge
(C++17)
переносит узлы из другого контейнера
(публичная функция-член)
Поиск
count
возвращает количество элементов, соответствующих заданному ключу
(публичная функция-член)
find
находит элемент с заданным ключом
(публичная функция-член)
contains
(C++20)
проверяет, содержит ли контейнер элемент с заданным ключом
(публичная функция-член)
equal_range
возвращает диапазон элементов, соответствующих заданному ключу
(публичная функция-член)
Интерфейс корзин
begin(size_type)cbegin(size_type)
возвращает итератор на начало указанной корзины
(публичная функция-член)
end(size_type)cend(size_type)
возвращает итератор на конец указанной корзины
(публичная функция-член)
bucket_count
возвращает количество корзин
(публичная функция-член)
max_bucket_count
возвращает максимальное количество корзин
(публичная функция-член)
bucket_size
возвращает количество элементов в заданной корзине
(публичная функция-член)
bucket
возвращает корзину для заданного ключа
(публичная функция-член)
Политика хеширования
load_factor
возвращает среднее количество элементов в одной корзине
(публичная функция-член)
max_load_factor
управляет максимальным средним количеством элементов в одной корзине
(публичная функция-член)
rehash
резервирует не меньше указанного количества корзин и перестраивает хеш-таблицу
(публичная функция-член)
reserve
резервирует место как минимум для указанного количества элементов и перестраивает хеш-таблицу
(публичная функция-член)
Функции-наблюдатели
hash_function
возвращает функцию, используемую для хеширования ключей
(публичная функция-член)
key_eq
возвращает функцию, используемую для сравнения ключей на равенство
(публичная функция-член)

Нефункции-члены

operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает значения в unordered_set
(шаблон функции)
std::swap(std::unordered_set)
(C++11)
специализирует алгоритм std::swap
(шаблон функции)
erase_if(std::unordered_set)
(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

См. также

unordered_multiset
(C++11)
набор ключей с хешированием по ключам
(шаблон класса)
set
набор уникальных ключей, отсортированных по ключам
(шаблон класса)
flat_set
(C++23)
адаптирует контейнер для хранения набора уникальных ключей, отсортированных по ключам
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_set

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API