Spec-Zone.ru › C++

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)

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

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 — пустой дескриптор узла, ничего не делает. В противном случае вставляет принадлежащий nh элемент в контейнер, если контейнер ещё не содержит элемента с ключом, эквивалентным nh.key(). Поведение не определено, если nh не пуст и get_allocator() != nh.get_allocator().
10) Если 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.

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

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) Если по какой-либо причине выбрасывается исключение, эти функции не оказывают никакого эффекта (гарантия строгой безопасности при исключениях).
7,8) Гарантия безопасности при исключениях отсутствует.
9,10) Если по какой-либо причине выбрасывается исключение, эти функции не оказывают никакого эффекта (гарантия строгой безопасности при исключениях).

Сложность

1-6) В среднем: O(1), в худшем случае O(size()).
7,8) В среднем: O(N), где N — число вставляемых элементов. В худшем случае: O(N * size() + N).
9,10) В среднем: 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"}});
    
    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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 2005 C++11 перегрузки (3,6) участвовали в разрешении
перегрузки только в том случае, если P неявно преобразуется в value_type
участвует только в том случае, если value_type
может быть сконструирован из P&&

См. также

emplace
создаёт элемент непосредственно в контейнере
(открытая функция-член)
emplace_hint
создаёт элементы непосредственно в контейнере, используя подсказку
(открытая функция-член)
insert_or_assign
(C++17)
вставляет элемент или присваивает значение существующему элементу, если ключ уже существует
(открытая функция-член)
inserter
создаёт std::insert_iterator типа, определяемого по аргументу
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/unordered_map/insert

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API