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. |
||
Возвращаемое значение
std::pair состоящую из итератора на вставленный элемент (или на элемент, который предотвратил вставку) и bool указывающую на то, произошла ли вставка (true если вставка произошла, false если нет).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"}});
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++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/container/unordered_map/insert