Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: insert

From cppreference.net
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)

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

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

Никакие итераторы или ссылки не инвалидируются. Если вставка успешна, указатели и ссылки на элемент, полученные пока он содержался в node handle, инвалидируются, а указатели и ссылки, полученные на этот элемент до его извлечения, становятся валидными. (since C++17)

Содержание

Параметры

pos - итератор на позицию, перед которой будет вставлен новый элемент
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) Если при выполнении любой операции возникает исключение, вставка не производится.

Сложность

1-3) Логарифмическая от размера контейнера, O(log(size())) .
4-6) Амортизированная константа, если вставка происходит в позицию непосредственно после (until C++11) перед (since C++11) pos , логарифмическая от размера контейнера в противном случае.
7,8) O(N·log(size() + N)) , где N - количество вставляемых элементов.
9) Логарифмическая от размера контейнера, O(log(size())) .
10) Амортизированная константа, если вставка происходит в позицию непосредственно перед pos , логарифмическая от размера контейнера в остальных случаях.

Примечания

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