std::unordered_map<Key,T,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++17) |
template< class P > std::pair<iterator, bool> insert( P&& value ); | (3) | (с C++11) |
iterator insert( const_iterator hint, const value_type& value ); | (4) | (с C++11) |
iterator insert( const_iterator hint, value_type&& value ); | (5) | (с C++17) |
template< class P > iterator insert( const_iterator hint, P&& value ); | (6) | (с C++11) |
template< class InputIt > void insert( InputIt first, InputIt last ); | (7) | (с C++11) |
void insert( std::initializer_list<value_type> ilist ); | (8) | (с C++11) |
insert_return_type insert( node_type&& nh ); | (9) | (с C++17) |
iterator insert( const_iterator hint, node_type&& nh ); | (10) | (с C++17) |
Вставляет элемент(ы) в контейнер, если контейнер ещё не содержит элемента с эквивалентным ключом.
value.emplace(std::forward<P>(value)) и участвует в разрешении перегрузки только в том случае, если std::is_constructible<value_type, P&&>::value == true.value, используя hint в качестве необязательной подсказки о том, с какого места следует начать поиск.emplace_hint(hint, std::forward<P>(value)) и участвует в разрешении перегрузки только в том случае, если std::is_constructible<value_type, P&&>::value == true.[first, last). Если несколько элементов диапазона имеют ключи, сравниваемые как эквивалентные, не определено, какой именно элемент будет вставлен (ожидает рассмотрения в LWG2844).[first, last) не является допустимым диапазоном, или first и/или last являются итераторами в *this, поведение не определено.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. |
||
Возвращаемое значение
true тогда и только тогда, когда вставка состоялась.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()).Примечания
Вставка с подсказкой (4-6) не возвращает логическое значение, чтобы быть совместимой по сигнатуре с позиционной вставкой в последовательные контейнеры, например std::vector::insert. Это позволяет создавать универсальные вставщики, такие как std::inserter. Один из способов проверить успешность вставки с подсказкой — сравнить size() до и после.
Пример
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
dict.insert({3, "three"});
dict.insert(std::make_pair(4, "four"));
dict.insert({{4, "another four"}, {5, "five"}});
const bool ok = dict.insert({1, "another one"}).second;
std::cout << "inserting 1 => \"another one\" "
<< (ok ? "succeeded" : "failed") << '\n';
std::cout << "contents:\n";
for (auto& p : dict)
std::cout << ' ' << p.first << " => " << p.second << '\n';
}
Возможный вывод:
inserting 1 => "another one" failed contents: 5 => five 1 => one 2 => two 3 => three 4 => four
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2005 | C++11 | перегрузки (3,6) участвовали в разрешении перегрузки только в том случае, если P неявно преобразуется в value_type | участвует только в том случае, если value_typeможет быть сконструирован из P&& |
См. также
| создаёт элемент непосредственно в контейнере (открытая функция-член) |
|
| создаёт элементы непосредственно в контейнере, используя подсказку (открытая функция-член) |
|
|
(C++17) | вставляет элемент или присваивает значение существующему элементу, если ключ уже существует (открытая функция-член) |
создаёт std::insert_iterator типа, определяемого по аргументу (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_map/insert