Namespaces
Variants

std::unordered_map<Key,T,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++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)

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

1-3) Вставляет value .
Перегрузка (3) эквивалентна emplace ( std:: forward < P > ( value ) ) и участвует в разрешении перегрузки только если std:: is_constructible < value_type, P && > :: value == true .
4-6) Вставляет value , используя hint в качестве необязательной подсказки о том, с какого места следует начать поиск.
Перегрузка (6) эквивалентна emplace_hint ( hint, std:: forward < P > ( value ) ) и участвует в разрешении перегрузки только если std:: is_constructible < value_type, P && > :: value == true .
7) Вставляет элементы из диапазона [ first , last ) . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидает решения LWG2844 ).
Если [ first , last ) не является допустимым диапазоном , или first и/или last являются итераторами в * this , поведение не определено.
8) Вставляет элементы из списка инициализации ilist . Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидает решения LWG2844 ).
9) Если nh является пустым node handle , не делает ничего. В противном случае вставляет элемент, принадлежащий nh в контейнер, если контейнер ещё не содержит элемент с ключом, эквивалентным nh. key ( ) . Поведение не определено, если nh не пуст и get_allocator ( ) ! = nh. get_allocator ( ) .
10) Если nh является пустым node handle , не выполняет никаких действий и возвращает конечный итератор. В противном случае вставляет элемент, принадлежащий nh в контейнер, если контейнер еще не содержит элемент с ключом, эквивалентным nh. key ( ) , и возвращает итератор, указывающий на элемент с ключом, эквивалентным nh. key ( ) (независимо от того, была ли вставка успешной или нет). Если вставка успешна, nh перемещается, в противном случае он сохраняет владение элементом. hint используется как необязательная подсказка о том, с чего следует начать поиск. Поведение не определено, если nh не пуст и get_allocator ( ) ! = nh. get_allocator ( ) .

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

Содержание

Параметры

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

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

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

Исключения

1-6) Если по любой причине выбрасывается исключение, эти функции не оказывают никакого эффекта ( strong exception safety guarantee ).
7,8) Гарантия безопасности исключений отсутствует.
9,10) Если по любой причине выбрасывается исключение, эти функции не оказывают никакого эффекта ( strong exception safety guarantee ).

Сложность

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

Примечания

Подсказанная вставка ( ( 4-6 ) и ( 10 ) ) не возвращает булево значение для совместимости сигнатур с позиционной вставкой в последовательных контейнерах, таких как 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++.

DR Applied to Behavior as published Correct behavior
LWG 2005 C++11 перегрузки ( 3 ) и ( 6 ) участвовали бы в разрешении перегрузки
только если P неявно преобразуется в value_type
участвует только если value_type
конструируется из P &&

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

создаёт элемент на месте
(public member function)
создаёт элементы на месте с использованием подсказки
(public member function)
вставляет элемент или присваивает значение текущему элементу, если ключ уже существует
(public member function)
создаёт std::insert_iterator типа, выведенного из аргумента
(function template)