std:: unordered_set
|
Определено в заголовочном файле
<unordered_set>
|
||
|
template
<
class
Key,
|
(1) | (начиная с C++11) |
|
namespace
pmr
{
template
<
|
(2) | (начиная с C++17) |
std::unordered_set
— это ассоциативный контейнер, содержащий набор уникальных объектов типа
Key
. Поиск, вставка и удаление имеют в среднем постоянную временную сложность.
Внутренне элементы не отсортированы в каком-либо определенном порядке, а организованы в сегменты (buckets). В какой сегмент помещается элемент, полностью зависит от хеша его значения. Это обеспечивает быстрый доступ к отдельным элементам, поскольку после вычисления хеша он указывает на точный сегмент, в который помещен элемент.
Элементы контейнера не могут быть изменены (даже неконстантными итераторами), поскольку изменение может изменить хеш элемента и повредить контейнер.
std::unordered_set
удовлетворяет требованиям
Container
,
AllocatorAwareContainer
,
UnorderedAssociativeContainer
.
Все функции-члены
std::unordered_set
являются
constexpr
: возможно создавать и использовать объекты
std::unordered_set
при вычислении константного выражения.
Однако объекты
|
(начиная с 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
>
|
Функции-члены
конструирует
unordered_set
(публичная функция-член) |
|
уничтожает
unordered_set
(публичная функция-член) |
|
|
присваивает значения контейнеру
(public member function) |
|
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Итераторы |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор на конец
(публичная функция-член) |
|
Емкость |
|
|
проверяет, является ли контейнер пустым
(публичная функция-член) |
|
|
возвращает количество элементов
(публичная функция-член) |
|
|
возвращает максимально возможное количество элементов
(public member function) |
|
Модификаторы |
|
|
очищает содержимое
(public member function) |
|
|
вставляет элементы
или узлы
(since C++17)
(public member function) |
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член) |
|
конструирует элемент на месте
(публичная функция-член) |
|
|
создаёт элементы на месте с использованием подсказки
(публичная функция-член) |
|
|
удаляет элементы
(публичная функция-член) |
|
|
обменивает содержимое
(публичная функция-член) |
|
|
(C++17)
|
извлекает узлы из контейнера
(публичная функция-член) |
|
(C++17)
|
объединяет узлы из другого контейнера
(публичная функция-член) |
Поиск |
|
|
возвращает количество элементов, соответствующих определённому ключу
(публичная функция-член) |
|
|
находит элемент с указанным ключом
(публичная функция-член) |
|
|
(C++20)
|
проверяет, содержит ли контейнер элемент с указанным ключом
(публичная функция-член) |
|
возвращает диапазон элементов, соответствующих определённому ключу
(публичная функция-член) |
|
Интерфейс Bucket |
|
|
возвращает итератор на начало указанной корзины
(public member function) |
|
|
возвращает итератор на конец указанной корзины
(публичная функция-член) |
|
|
возвращает количество сегментов
(публичная функция-член) |
|
|
возвращает максимальное количество сегментов
(публичная функция-член) |
|
|
возвращает количество элементов в конкретной корзине
(публичная функция-член) |
|
|
возвращает сегмент для указанного ключа
(публичная функция-член) |
|
Политика хеширования |
|
|
возвращает среднее количество элементов на сегмент
(публичная функция-член) |
|
|
управляет максимальным средним количеством элементов на сегмент
(публичная функция-член) |
|
|
резервирует как минимум указанное количество сегментов и перестраивает хеш-таблицу
(публичная функция-член) |
|
|
резервирует место как минимум для указанного количества элементов и регенерирует хеш-таблицу
(публичная функция-член) |
|
Наблюдатели |
|
|
возвращает функцию, используемую для хеширования ключей
(public member function) |
|
|
возвращает функцию, используемую для сравнения ключей на равенство
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(C++11)
(C++11)
(удалено в C++20)
|
сравнивает значения в unordered_set
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(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}; // создает набор целых чисел 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++11)
|
коллекция ключей, хэшируемая по ключам
(шаблон класса) |
|
коллекция уникальных ключей, отсортированная по ключам
(шаблон класса) |
|
|
(C++23)
|
адаптирует контейнер для предоставления коллекции уникальных ключей, отсортированной по ключам
(шаблон класса) |