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. Поиск, вставка и удаление имеют среднее время выполнения, равное константе.

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

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

std::unordered_set соответствует требованиям контейнера, контейнера с поддержкой аллокатора, неупорядоченного ассоциативного контейнера.

Недействительность итераторов

Операции Итераторы аннулируются
Все операции чтения, 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 Постоянный итератор к value_type
const_iterator Итератор к const value_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.

Макросы проверки наличия функций Значение Std Функция
__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}; // 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++.

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

См. также

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

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

Spec-Zone.ru

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