std::map<Key,T,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | |
|
template
<
class
P
>
std:: pair < iterator, bool > insert ( P && value ) ; |
(2) | (начиная с C++11) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(3) | (начиная с C++17) |
| (4) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(до C++11) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(начиная с C++11) | |
|
template
<
class
P
>
iterator insert ( const_iterator pos, P && value ) ; |
(5) | (начиная с C++11) |
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(6) | (начиная с C++17) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(7) | |
|
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 pos, node_type
&&
nh
)
;
|
(10) | (начиная с C++17) |
Вставляет элемент(ы) в контейнер, если контейнер еще не содержит элемент с эквивалентным ключом.
[
first
,
last
)
. Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (ожидается
LWG2844
).
Никакие итераторы или ссылки не инвалидируются. Если вставка успешна, указатели и ссылки на элемент, полученные пока он содержался в node handle, инвалидируются, а указатели и ссылки, полученные на этот элемент до его извлечения, становятся валидными. (since C++17)
Содержание |
Параметры
| pos | - | итератор на позицию, перед которой будет вставлен новый элемент |
| 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 ( ) .
Исключения
|
Этот раздел не завершён
Причина: случаи 7-10 |
Сложность
O(log(size()))
.
O(N·log(size() + N))
, где
N
- количество вставляемых элементов.
O(log(size()))
.
Примечания
Подсказанная вставка
(
(
4-6
)
и
(
10
)
)
не возвращает булево значение для совместимости по сигнатуре с позиционной вставкой в последовательных контейнерах, таких как
std::vector::insert
. Это позволяет создавать универсальные вставщики, такие как
std::inserter
. Один из способов проверить успешность подсказанной вставки — сравнить
size()
до и после операции.
Пример
#include <iomanip> #include <iostream> #include <map> #include <string> using namespace std::литералы; template<typename It> void print_insertion_status(It it, bool success) { std::cout << "Вставка " << it->first << (success ? " выполнено успешно\n" : " не удалось\n"); } int main() { std::map<std::string, float> heights; // Перегрузка 3: вставка из rvalue-ссылки const auto [it_hinata, success] = heights.insert({"Хината"s, 162.8}); print_insertion_status(it_hinata, success); { // Перегрузка 1: вставка из lvalue-ссылки const auto [it, success2] = heights.insert(*it_hinata); print_insertion_status(it, success2); } { // Перегрузка 2: вставка через перенаправление к emplace const auto [it, success] = heights.insert(std::pair{"Кагэяма", 180.6}); print_insertion_status(it, success); } { // Перегрузка 6: вставка из rvalue-ссылки с позиционной подсказкой const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, {"Адзумане"s, 184.7}); print_insertion_status(it, std::size(heights) != n); } { // Перегрузка 4: вставка из lvalue-ссылки с позиционной подсказкой const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, *it_hinata); print_insertion_status(it, std::size(heights) != n); } { // Перегрузка 5: вставка через переадресацию к emplace с позиционной подсказкой const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, std::pair{"Цукисима", 188.3}); print_insertion_status(it, std::size(heights) != n); } auto node_hinata = heights.extract(it_hinata); std::map<std::string, float> heights2; // Перегрузка 7: вставка из диапазона итераторов heights2.insert(std::begin(heights), std::end(heights)); // Перегрузка 8: вставка из initializer_list heights2.insert({{"Кодзумэ"s, 169.2}, {"Куроо", 187.7}}); // Перегрузка 9: вставка узла const auto status = heights2.insert(std::move(node_hinata)); print_insertion_status(status.position, status.вставленный); node_hinata = heights2.extract(status.position); { // Перегрузка 10: вставка узла с позиционной подсказкой const std::size_t n = std::size(heights2); const auto it = heights2.insert(std::begin(heights2), std::move(node_hinata)); print_insertion_status(it, std::size(heights2) != n); } // Вывод результирующей карты std::cout << std::left << '\n'; for (const auto& [name, height] : heights2) std::cout << std::setw(10) << name << " | " << height << "см\n"; }
Вывод:
Вставка Hinata выполнена успешно Вставка Hinata не удалась Вставка Kageyama выполнена успешно Вставка Azumane выполнена успешно Вставка Hinata не удалась Вставка Tsukishima выполнена успешно Вставка Hinata выполнена успешно Вставка Hinata выполнена успешно Azumane | 184.7cm Hinata | 162.8cm Kageyama | 180.6cm Kozume | 169.2cm Kuroo | 187.7cm Tsukishima | 188.3cm
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 233 | C++98 | pos был просто подсказкой, его можно было полностью игнорировать |
вставка должна быть
как можно ближе к позиции непосредственно перед pos |
| LWG 264 | C++98 |
сложность перегрузки
(
7
)
должна была быть линейной, если
диапазон
[
first
,
last
)
отсортирован согласно
Compare
|
убрано требование линейной сложности
в этом специальном случае |
| LWG 316 | C++98 |
в возвращаемом значении перегрузки
(
1
)
не было указано,
какое значение bool указывает на успешную вставку |
успех
указывается значением true |
| LWG 2005 | C++11 | перегрузки ( 2 ) и ( 5 ) были плохо описаны | улучшено описание |
Смотрите также
|
(C++11)
|
создаёт элемент на месте
(public member function) |
|
(C++11)
|
создаёт элементы на месте с использованием подсказки
(public member function) |
|
(C++17)
|
вставляет элемент или присваивает значение текущему элементу, если ключ уже существует
(public member function) |
|
создаёт
std::insert_iterator
типа, выведенного из аргумента
(function template) |