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) |
Вставляет элемент(ы) в контейнер, если контейнер еще не содержит элемент с эквивалентным ключом.
[
first
,
last
)
. Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидает решения
LWG2844
).
[
first
,
last
)
не является
допустимым диапазоном
, или
first
и/или
last
являются итераторами в
*
this
, поведение не определено.
Если после операции новое количество элементов становится больше, чем старое
max_load_factor()
*
bucket_count()
происходит рехэширование.
Если происходит рехэширование (из-за вставки), все итераторы становятся недействительными. В противном случае (без рехэширования) итераторы остаются действительными.
Если вставка успешна, указатели и ссылки на элемент, полученные пока он находился в node handle, становятся недействительными, а указатели и ссылки, полученные на этот элемент до его извлечения, становятся действительными.
(since C++17)
Содержание |
Параметры
| hint | - | итератор, используемый как подсказка о том, куда вставлять содержимое |
| value | - | значение элемента для вставки |
| first, last | - | пара итераторов, определяющая исходный диапазон элементов для вставки |
| ilist | - | список инициализации, из которого берутся значения для вставки |
| nh | - | совместимый node handle |
| Требования к типам | ||
-
InputIt
должен удовлетворять требованиям
LegacyInputIterator
.
|
||
Возвращаемое значение
insert_return_type
с инициализированными членами следующим образом:
-
Если
nh
пуст,
insertedравен false ,positionравен end ( ) , иnodeпуст. -
Иначе, если вставка произошла,
insertedравен true ,positionуказывает на вставленный элемент, иnodeпуст. -
Если вставка не удалась,
insertedравен false ,nodeсодержит предыдущее значение nh , иpositionуказывает на элемент с ключом, эквивалентным nh. key ( ) .
Исключения
Сложность
O(1)
, в худшем случае
O(size())
.
O(N)
, где N - количество вставляемых элементов. Худший случай:
O(N * size() + N)
.
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) |
|
|
(C++17)
|
вставляет элемент или присваивает значение текущему элементу, если ключ уже существует
(public member function) |
|
создаёт
std::insert_iterator
типа, выведенного из аргумента
(function template) |