std::unordered_set<Key,Hash,KeyEqual,Allocator>::insert
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) |
Вставляет элемент(ы) в контейнер, если в контейнере ещё нет элемента с эквивалентным ключом.
value. value, используя hint в качестве необязательной подсказки, с какой позиции начать поиск.[first, last). Если несколько элементов в диапазоне имеют эквивалентные ключи, какой элемент будет вставлен, не определено (ожидается решение LWG2844).ilist. Если несколько элементов в диапазоне имеют эквивалентные ключи, какой элемент будет вставлен, не определено (ожидается решение LWG2844).nh — пустой указатель узла, ничего не делает. В противном случае, вставляет элемент, принадлежащий nh в контейнер, если в контейнере ещё нет элемента с ключом, эквивалентным nh.key(). Поведение не определено, если nh не пуст и get_allocator() != nh.get_allocator().nh — пустой указатель узла, ничего не делает и возвращает итератор на конец. В противном случае вставляет элемент, принадлежащий nh в контейнер, если в контейнере ещё нет элемента с ключом, эквивалентным nh.key(), и возвращает итератор, указывающий на элемент с ключом, эквивалентным nh.key() (независимо от того, произошла вставка или нет). Если вставка успешна, nh перемещается, в противном случае сохраняет владение элементом. hint используется как неявная подсказка, с какой позиции начать поиск. Поведение не определено, если nh не пуст и get_allocator() != nh.get_allocator().Если после операции новое количество элементов больше старого max_load_factor() * bucket_count(), происходит перехеширование.
Если перехеширование происходит (из-за вставки), все итераторы становятся недействительными. В противном случае (нет перехеширования), итераторы не становятся недействительными. Если вставка успешна, указатели и ссылки на элемент, полученные, когда он хранится в указателе узла, становятся недействительными, а указатели и ссылки, полученные на этот элемент до его извлечения, становятся действительными.(с C++17)
Параметры
| hint | - | итератор, используемый как подсказка, куда вставить содержимое |
| value | - | значение элемента для вставки |
| first, last | - | диапазон элементов для вставки |
| ilist | - | список инициализации для вставки значений из него |
| nh | - | совместимый указатель узла |
| Требования к типу | ||
-InputIt должен соответствовать требованиям LegacyInputIterator. |
||
Возвращаемое значение
bool , указывающей, произошла ли вставка.insert_return_type с инициализированными членами следующим образом:
- Если
nhпуст,inserted—false,position—end(), иnode— пуст. - В противном случае, если вставка произошла,
inserted—true,positionуказывает на вставленный элемент, иnode— пуст. - Если вставка не удалась,
inserted—false,nodeимеет предыдущее значениеnh, иpositionуказывает на элемент с ключом, эквивалентнымnh.key().
nh был пустым, итератор на вставленный элемент, если вставка произошла, и итератор на элемент с ключом, эквивалентным nh.key() , если вставка не удалась.Исключение
Сложность
O(1), худший случай O(size()).O(N), где N — количество элементов для вставки. Худший случай: O(N * size() + N).O(1), худший случай O(size()).Примечания
Вставка с подсказкой (3,4) не возвращает boolean, чтобы быть совместимой с позиционной вставкой в последовательных контейнерах, таких как std::vector::insert. Это позволяет создавать универсальные вставки, такие как std::inserter. Один из способов проверить успешность вставки с подсказкой — сравнить size() до и после.
Пример
#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 }См. также
| создаёт элемент на месте (публичный член-функция) |
|
| создаёт элементы на месте с подсказкой (публичный член-функция) |
|
| создаёт итератор типа, выведенного из аргумента (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/unordered_set/insert