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, специализация
|
Члены-функции
создаёт 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.
| Макросы проверки наличия функций | Значение | 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 |
См. также
| набор уникальных ключей, отсортированных по ключам (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/unordered_set