Namespaces
Variants

std::unordered_set<Key,Hash,KeyEqual,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (начиная с C++11)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (начиная с C++11)
iterator insert ( const_iterator hint, const value_type & value ) ;
(3) (начиная с C++11)
iterator insert ( const_iterator hint, value_type && value ) ;
(4) (начиная с C++11)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(5) (начиная с C++11)
void insert ( std:: initializer_list < value_type > ilist ) ;
(6) (начиная с C++11)
insert_return_type insert ( node_type && nh ) ;
(7) (начиная с C++17)
iterator insert ( const_iterator hint, node_type && nh ) ;
(8) (начиная с C++17)
template < class K >
std:: pair < iterator, bool > insert ( K && obj ) ;
(9) (начиная с C++23)
template < class K >
iterator insert ( const_iterator hint, K && obj ) ;
(10) (начиная с C++23)

Вставляет элемент(ы) в контейнер, если контейнер еще не содержит элемент с эквивалентным ключом.

1,2) Вставляет value .
3,4) Вставляет value , используя hint в качестве необязательной подсказки о том, с какого места следует начать поиск.
5) Вставляет элементы из диапазона [ first , last ) . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидает решения LWG2844 ).
6) Вставляет элементы из списка инициализации ilist . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидает решения LWG2844 ).
7) Если nh является пустым node handle , ничего не делает. В противном случае вставляет элемент, принадлежащий nh в контейнер, если контейнер ещё не содержит элемент с ключом, эквивалентным nh. key ( ) . Поведение не определено, если nh не пуст и get_allocator ( ) ! = nh. get_allocator ( ) .
8) Если nh является пустым node handle , не выполняет никаких действий и возвращает конечный итератор. В противном случае вставляет элемент, принадлежащий nh в контейнер, если контейнер еще не содержит элемент с ключом, эквивалентным nh. key ( ) , и возвращает итератор, указывающий на элемент с ключом, эквивалентным nh. key ( ) (независимо от того, была ли вставка успешной или нет). Если вставка успешна, nh перемещается, в противном случае сохраняет владение элементом. hint используется как необязательная подсказка, с чего начать поиск. Поведение не определено, если nh не пуст и get_allocator ( ) ! = nh. get_allocator ( ) .
9) Если * this уже содержит элемент, который прозрачно сравнивается эквивалентно с obj , ничего не делает. В противном случае создает объект u типа value_type с помощью std:: forward < K > ( obj ) и затем вставляет u в * this . Если equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) равно true , поведение не определено. value_type должен быть EmplaceConstructible в unordered_set из std:: forward < K > ( obj ) . Эта перегрузка участвует в разрешении перегрузки только если Hash и KeyEqual оба являются прозрачными . Это предполагает, что такой Hash может быть вызван как с типом K , так и с типом Key , и что KeyEqual является прозрачным, что вместе позволяет вызывать эту функцию без создания экземпляра Key .
10) Если * this уже содержит элемент, который прозрачно сравнивается эквивалентным с obj , ничего не делает.

В противном случае, создаёт объект u типа value_type с помощью std:: forward < K > ( obj ) и затем вставляет u в * this . Template:hint используется как необязательная подсказка, с чего начать поиск. Если equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) равно true , поведение не определено. Тип value_type должен быть EmplaceConstructible в unordered_set из std:: forward < K > ( obj ) . Эта перегрузка участвует в разрешении перегрузки только если:

  • std:: is_convertible_v < K && , const_iterator > и std:: is_convertible_v < K && , iterator > оба равны false , и
  • Hash :: is_transparent и KeyEqual :: is_transparent являются валидными и каждый обозначает тип. Это предполагает, что такой Hash может быть вызван как с типом K , так и с типом Key , и что KeyEqual является прозрачным,
что, вместе, позволяет вызывать эту функцию без создания экземпляра Key .

Если после операции новое количество элементов превышает старое значение max_load_factor() * bucket_count() происходит рехэширование.
Если происходит рехэширование (из-за вставки), все итераторы становятся недействительными. В противном случае (без рехэширования) итераторы остаются действительными. Если вставка успешна, указатели и ссылки на элемент, полученные пока он находился в node handle, становятся недействительными, а указатели и ссылки, полученные до его извлечения, становятся действительными. (since C++17)

Содержание

Параметры

hint - итератор, используемый как подсказка о том, куда вставлять содержимое
value - значение элемента для вставки
first, last - пара итераторов, определяющая исходный диапазон элементов для вставки
ilist - список инициализации, из которого вставляются значения
nh - совместимый node handle
obj - значение любого типа, которое можно прозрачно сравнивать с ключом
Требования к типам
-
InputIt должен удовлетворять требованиям LegacyInputIterator .

Возвращаемое значение

1,2) Пара, состоящая из итератора к вставленному элементу (или к элементу, который предотвратил вставку) и значения bool установленного в true тогда и только тогда, когда вставка произошла.
3,4) Итератор на вставленный элемент или на элемент, который предотвратил вставку.
5,6) (нет)
7) Объект типа insert_return_type с членами, инициализированными следующим образом:
  • Если nh пуст, inserted равен false , position равен end ( ) , и node пуст.
  • Иначе, если вставка произошла, inserted равен true , position указывает на вставленный элемент, и node пуст.
  • Если вставка не удалась, inserted равен false , node содержит предыдущее значение nh , и position указывает на элемент с ключом, эквивалентным nh. key ( ) .
8) Конечный итератор, если nh был пустым, итератор, указывающий на вставленный элемент, если вставка произошла, и итератор, указывающий на элемент с ключом, эквивалентным nh. key ( ) если она не удалась.
9) Пара, состоящая из итератора на вставленный элемент (или на элемент, который предотвратил вставку) и bool значения, установленного в true тогда и только тогда, когда вставка произошла.
10) Итератор на вставленный элемент или на элемент, который предотвратил вставку.

Исключения

1-4) Если при выполнении любой операции возникает исключение, вставка не производится.

Сложность

1-4) В среднем случае: O(1) , в худшем случае O(size()) .
5,6) Средний случай: O(N) , где N - количество вставляемых элементов. Худший случай: O(N * size() + N) .
7-10) Средний случай: O(1) , худший случай O(size()) .

Примечания

Подсказанная вставка ( ( 3,4 ) , ( 8 ) и ( 10 ) ) не возвращает булево значение для сохранения совместимости сигнатур с позиционной вставкой в последовательных контейнерах, таких как std::vector::insert . Это позволяет создавать универсальные вставщики, такие как std::inserter . Один из способов проверить успешность подсказанной вставки — сравнить size() до и после операции.

Feature-test macro Value Std Feature
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) Гетерогенные перегрузки для оставшихся функций-членов в упорядоченных и неупорядоченных ассоциативных контейнерах . ( 9,10 )

Пример

#include <array>
#include <iostream>
#include <unordered_set>
std::ostream& operator<<(std::ostream& os, std::unordered_set<int> const& s)
{
    for (os << '[' << s.size() << "] { "; int i : s)
        os << i << ' ';
    return os << "}\n";
}
int main ()
{
    std::unordered_set<int> nums{2, 3, 4};
    std::cout << "1) Initially: " << nums << std::boolalpha;
    auto p = nums.insert(1); // insert element, overload (1)
    std::cout << "2) '1' was inserted: " << p.second << '\n';
    std::cout << "3) After insertion: " << nums;
    nums.insert(p.first, 0); // insert with hint, overload (3)
    std::cout << "4) After insertion: " << nums;
    std::array<int, 4> a = {10, 11, 12, 13};
    nums.insert(a.begin(), a.end()); // insert range, overload (5)
    std::cout << "5) After insertion: " << nums;
    nums.insert({20, 21, 22, 23}); // insert initializer_list, (6)
    std::cout << "6) After insertion: " << nums;
    std::unordered_set<int> other_nums = {42, 43};
    auto node = other_nums.extract(other_nums.find(42));
    nums.insert(std::move(node)); // insert node, overload (7)
    std::cout << "7) After insertion: " << nums;
    node = other_nums.extract(other_nums.find(43));
    nums.insert(nums.begin(), std::move(node)); // insert node with hint, (8)
    std::cout << "8) After insertion: " << nums;
}

Возможный вывод:

1) Initially: [3] { 4 3 2 }
2) '1' was inserted: true
3) After insertion: [4] { 1 2 3 4 }
4) After insertion: [5] { 0 1 2 3 4 }
5) After insertion: [9] { 13 12 11 10 4 3 2 1 0 }
6) After insertion: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
7) After insertion: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
8) After insertion: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }

Смотрите также

создаёт элемент на месте
(публичная функция-член)
создаёт элементы на месте с использованием подсказки
(публичная функция-член)
создаёт std::insert_iterator типа, выведенного из аргумента
(шаблон функции)