Namespaces
Variants

std:: unordered_set

From cppreference.net
Определено в заголовочном файле <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 . Поиск, вставка и удаление имеют в среднем постоянную временную сложность.

Внутренне элементы не отсортированы в каком-либо определенном порядке, а организованы в сегменты (buckets). В какой сегмент помещается элемент, полностью зависит от хеша его значения. Это обеспечивает быстрый доступ к отдельным элементам, поскольку после вычисления хеша он указывает на точный сегмент, в который помещен элемент.

Элементы контейнера не могут быть изменены (даже неконстантными итераторами), поскольку изменение может изменить хеш элемента и повредить контейнер.

std::unordered_set удовлетворяет требованиям Container , AllocatorAwareContainer , UnorderedAssociativeContainer .

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

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

(начиная с C++26)

Содержание

Инвалидация итераторов

Операции Инвалидируются
Все операции только для чтения, swap , std::swap Никогда
clear , rehash , reserve , operator= Всегда
insert , emplace , emplace_hint Только если вызывает рехэширование
erase Только удаляемый элемент

Примечания

  • Функции swap не инвалидируют ни один из итераторов внутри контейнера, но они инвалидируют итератор, обозначающий конец области обмена.
  • Ссылки и указатели на данные, хранящиеся в контейнере, становятся недействительными только при удалении этого элемента, даже если соответствующий итератор становится недействительным.
  • После операции перемещения контейнера, если поэлементное перемещение не принудительно из-за несовместимых аллокаторов, ссылки, указатели и итераторы (кроме конечного итератора) на перемещённый контейнер остаются валидными, но ссылаются на элементы, которые теперь находятся в * 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 const value_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) к const value_type
local_iterator Тип итератора, категория, тип значения, разности, указателя и
ссылки которого совпадают с iterator . Этот итератор
может использоваться для обхода одной корзины, но не между корзинами
const_local_iterator Тип итератора, категория, тип значения, разности, указателя и
ссылки которого совпадают с const_iterator . Этот итератор
может использоваться для обхода одной корзины, но не между корзинами
node_type (начиная с C++17) специализация node handle , представляющая узел контейнера
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
(публичная функция-член)
присваивает значения контейнеру
(public member function)
возвращает связанный аллокатор
(публичная функция-член)
Итераторы
возвращает итератор на начало
(публичная функция-член)
возвращает итератор на конец
(публичная функция-член)
Емкость
проверяет, является ли контейнер пустым
(публичная функция-член)
возвращает количество элементов
(публичная функция-член)
возвращает максимально возможное количество элементов
(public member function)
Модификаторы
очищает содержимое
(public member function)
вставляет элементы или узлы (since C++17)
(public member function)
вставляет диапазон элементов
(публичная функция-член)
конструирует элемент на месте
(публичная функция-член)
создаёт элементы на месте с использованием подсказки
(публичная функция-член)
удаляет элементы
(публичная функция-член)
обменивает содержимое
(публичная функция-член)
(C++17)
извлекает узлы из контейнера
(публичная функция-член)
(C++17)
объединяет узлы из другого контейнера
(публичная функция-член)
Поиск
возвращает количество элементов, соответствующих определённому ключу
(публичная функция-член)
находит элемент с указанным ключом
(публичная функция-член)
(C++20)
проверяет, содержит ли контейнер элемент с указанным ключом
(публичная функция-член)
возвращает диапазон элементов, соответствующих определённому ключу
(публичная функция-член)
Интерфейс Bucket
возвращает итератор на начало указанной корзины
(public member function)
возвращает итератор на конец указанной корзины
(публичная функция-член)
возвращает количество сегментов
(публичная функция-член)
возвращает максимальное количество сегментов
(публичная функция-член)
возвращает количество элементов в конкретной корзине
(публичная функция-член)
возвращает сегмент для указанного ключа
(публичная функция-член)
Политика хеширования
возвращает среднее количество элементов на сегмент
(публичная функция-член)
управляет максимальным средним количеством элементов на сегмент
(публичная функция-член)
резервирует как минимум указанное количество сегментов и перестраивает хеш-таблицу
(публичная функция-член)
резервирует место как минимум для указанного количества элементов и регенерирует хеш-таблицу
(публичная функция-член)
Наблюдатели
возвращает функцию, используемую для хеширования ключей
(public member function)
возвращает функцию, используемую для сравнения ключей на равенство
(публичная функция-член)

Функции, не являющиеся членами класса

(C++11) (C++11) (удалено в C++20)
сравнивает значения в unordered_set
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)
удаляет все элементы, удовлетворяющие определенным критериям
(шаблон функции)

Руководства по выводу

(начиная с 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}; // создает набор целых чисел
    print(mySet);
    mySet.insert(5); // добавляет элемент 5 в набор
    print(mySet);
    if (auto iter = mySet.find(5); iter != mySet.end())
        mySet.erase(iter); // удаляет элемент, на который указывает iter
    print(mySet);
    mySet.erase(7); // удаляет элемент 7
    print(mySet);
}

Возможный вывод:

8 1 7 2
5 8 1 7 2
8 1 7 2
8 1 2

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2050 C++11 определения reference , const_reference , pointer
и const_pointer были основаны на allocator_type
основаны на value_type и
std::allocator_traits

Смотрите также

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