std::unordered_set
— это ассоциативный контейнер, содержащий набор уникальных объектов типа
Key
. Поиск, вставка и удаление имеют в среднем постоянную временную сложность.
Внутренне элементы не отсортированы в каком-либо определенном порядке, а организованы в сегменты (buckets). В какой сегмент помещается элемент, полностью зависит от хеша его значения. Это обеспечивает быстрый доступ к отдельным элементам, поскольку после вычисления хеша он указывает на точный сегмент, в который помещен элемент.
Элементы контейнера не могут быть изменены (даже неконстантными итераторами), поскольку изменение может изменить хеш элемента и повредить контейнер.
Все функции-члены
std::unordered_set
являются
constexpr
: возможно создавать и использовать объекты
std::unordered_set
при вычислении константного выражения.
Однако объекты
std::unordered_set
обычно не могут быть
constexpr
, поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.
Функции swap не инвалидируют ни один из итераторов внутри контейнера, но они инвалидируют итератор, обозначающий конец области обмена.
Ссылки и указатели на данные, хранящиеся в контейнере, становятся недействительными только при удалении этого элемента, даже если соответствующий итератор становится недействительным.
После операции перемещения контейнера, если поэлементное перемещение не принудительно из-за несовместимых аллокаторов, ссылки, указатели и итераторы (кроме конечного итератора) на перемещённый контейнер остаются валидными, но ссылаются на элементы, которые теперь находятся в
*
this
.
Параметры шаблона
Этот раздел не завершён
Причина: Добавьте описания параметров шаблона.
Типы-члены
Тип
Определение
key_type
Key
value_type
Key
size_type
беззнаковый целочисленный тип (обычно std::size_t)
difference_type
знаковый целочисленный тип (обычно std::ptrdiff_t)
типу итератора, чьи категория, тип значения, тип разности, тип указателя и тип ссылки совпадают с iterator. Этот итератор может использоваться для обхода одной корзины, но не для перехода между корзинами
const_local_iterator
тип итератора, чьи категория, тип значения, тип разности, тип указателя и тип ссылки совпадают с const_iterator. Этот итератор может использоваться для обхода одной корзины, но не для перехода между корзинами
Типы-члены
iterator
и
const_iterator
могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти два типа в качестве типов параметров, может нарушать
Правило Одного Определения
. Поскольку
iterator
конвертируется в
const_iterator
, вместо этого будет работать единственная функция с параметром типа
const_iterator
.
#include <iostream>#include <unordered_set>void print(constauto& set){for(constauto& 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++.