Пространства имён
Варианты
Действия

std::unordered_set

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <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.

Содержание

[править] Аннулирование итераторов

Операция Аннулируются
Все операции только для чтения, 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 const value_type& [править]
pointer std::allocator_traits<Allocator>::pointer [править]
const_pointer std::allocator_traits<Allocator>::const_pointer [править]
iterator Constant LegacyForwardIterator в value_type [править]
const_iterator LegacyForwardIterator в const value_type [править]
local_iterator Тип итератора, category, value, difference, pointer и
ссылочные типы которого совпадают с типами iterator. Этот итератор
можно использовать для итерации по одному сегменту, но не по сегментам.[править]
const_local_iterator Тип итератора, category, value, difference, pointer и
ссылочные типы которого совпадаю�� с типами const_iterator. Этот итератор можно использовать для итерации по одному сегменту, но не по сегментам.[править]
node_type (начиная с C++17) специализация дескриптора узла, представляющая узел контейнера [править]
insert_return_type (начиная с C++17) тип, описывающий результат вставки node_type, специализация

template <class Iter, class NodeType> struct /*неопределена*/ {
    Iter     position;
    bool     inserted;
    NodeType node;
};

создаётся с аргументами шаблона iterator и node_type. [править]

[править] Функции-элементы

создаёт unordered_set
(public функция-элемент) [править]
уничтожает unordered_set
(public функция-элемент) [править]
(C++11)
присваивает значения контейнеру
(public функция-элемент) [править]
возвращает связанный аллокатор
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]
(C++11)
возвращает итератор на конец
(public функция-элемент) [править]
Ёмкость
(C++11)
проверяет, пуст ли контейнер
(public функция-элемент) [править]
(C++11)
возвращает количество элементов
(public функция-элемент) [править]
(C++11)
возвращает максимально возможное количество элементов
(public функция-элемент) [править]
Модификаторы
(C++11)
очищает содержимое
(public функция-элемент) [править]
(C++11)
вставляет элементы или узлы (начиная с C++17)
(public функция-элемент) [править]
вставляет ряд элементов
(public функция-элемент) [править]
(C++11)
создаёт элемент на месте
(public функция-элемент) [править]
создаёт элементы на месте, используя подсказку
(public функция-элемент) [править]
(C++11)
удаляет элементы
(public функция-элемент) [править]
(C++11)
обменивает содержимое
(public функция-элемент) [править]
(C++17)
извлекает узлы из контейнера
(public функция-элемент) [править]
(C++17)
сливает с узлами из другого контейнера
(public функция-элемент) [править]
Просмотр
(C++11)
возвращает количество элементов, соответствующих определённому ключу
(public функция-элемент) [править]
(C++11)
ищет элемент с определённым ключом
(public функция-элемент) [править]
(C++20)
проверяет, содержит ли контейнер элемент с определённым ключом
(public функция-элемент) [править]
возвращает диапазон элементов, соответствующих определённому ключу
(public функция-элемент) [править]
Интерфейс сегментов
возвращает итератор на начало указанного сегмента
(public функция-элемент) [править]
возвращает итератор на конец указанного сегмента
(public функция-элемент) [править]
возвращает количество сегментов
(public функция-элемент) [править]
возвращает максимальное количество сегментов
(public функция-элемент) [править]
возвращает количество элементов в конкретном сегменте
(public функция-элемент) [править]
(C++11)
возвращает сегмент для конкретного ключа
(public функция-элемент) [править]
Политика хеширования
возвращает среднее количество элементов на сегмент
(public функция-элемент) [править]
управляет максимальным средним количеством элементов на сегмент
(public функция-элемент) [править]
(C++11)
резервирует как минимум указанное количество сегментов и регенерирует хеш-таблицу
(public функция-элемент) [править]
(C++11)
резервирует место по крайней мере для указанного количества элементов и регенерирует хеш-таблицу
(public функция-элемент) [править]
Наблюдатели
возвращает функцию, используемую для хэширования ключей
(public функция-элемент) [править]
(C++11)
возвращает функцию, используемую для сравнения ключей на равенство
(public функция-элемент) [править]

[править] Функции, не являющиеся элементами

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

Правила вывода

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

[править] Примечание

Типы элементы iterator и const_iterator могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций с использованием этих двух типов в качестве типов параметров может нарушить Правило Одного Определения. Поскольку iterator можно преобразовать в const_iterator, будет работать одна функция с типом параметра const_iterator.

Макрос тест функциональности Значение Стандарт Комментарий
__cpp_lib_containers_ranges 202202L (C++23) Создание и вставка диапазонов для контейнеров

[править] Пример

#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}; // создаёт набор int
    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++:

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

[править] Смотрите также

коллекция уникальных ключей, отсортированная по ключам
(шаблон класса) [править]