Spec-Zone.ru › C++

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert

std::pair<iterator, bool> insert( const value_type& value );
(1) (начиная с C++23)
std::pair<iterator, bool> insert( value_type&& value );
(2) (начиная с C++23)
iterator insert( const_iterator pos, const value_type& value );
(3) (начиная с C++23)
iterator insert( const_iterator pos, value_type&& value );
(4) (начиная с C++23)
template< class P >
std::pair<iterator, bool> insert( P&& x );
(5) (начиная с C++23)
template< class P >
iterator insert( const_iterator pos, P&& x );
(6) (начиная с C++23)
template< class InputIt >
void insert( InputIt first, InputIt last );
(7) (начиная с C++23)
template< class InputIt >
void insert( std::sorted_unique_t, InputIt first, InputIt last );
(8) (начиная с C++23)
void insert( std::initializer_list<key_type> ilist );
(9) (начиная с C++23)
void insert( std::sorted_unique_t s, std::initializer_list<key_type> ilist );
(10) (начиная с C++23)

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

1) Вставляет value. Эквивалентно return emplace(value);.
2) Вставляет value. Эквивалентно return emplace(std::move(value));.
3) Вставляет value в позицию, максимально близкую к позиции непосредственно перед pos. Эквивалентно return emplace_hint(pos, value);.
4) Вставляет value в позицию, максимально близкую к позиции непосредственно перед pos. Эквивалентно return emplace_hint(pos, std::move(value));.
5) Если *this уже содержит элемент, который прозрачно сравнивается как эквивалентный x, ничего не делает. В противном случае вставляет x в *this, как если бы выполнялось emplace(std::forward<P>(x));. Эта перегрузка участвует в разрешении перегрузки только в том случае, если std::is_constructible_v<pair<key_type, mapped_type>, P> является true.
6) Если *this уже содержит элемент, который прозрачно сравнивается как эквивалентный x, ничего не делает. В противном случае вставляет x в *this в позицию, максимально близкую к позиции непосредственно перед pos. Эквивалентно return emplace_hint(position, std::forward<P>(x));. Эта перегрузка участвует в разрешении перегрузки только в том случае, если std::is_constructible_v<pair<key_type, mapped_type>, P> является true.
7) Вставляет элементы из диапазона [first, last), последовательно выполняя следующие операции:
  1. Добавляет элементы в c, как если бы выполнялось
    for (; first != last; ++first){value_type value = *first;c.keys.insert(c.keys.end(), std::move(value.first));c.values.insert(c.values.end(), std::move(value.second));}
  2. Сортирует диапазон только что вставленных элементов относительно value_comp.
  3. Объединяет полученный отсортированный диапазон с отсортированным диапазоном ранее существовавших элементов в один отсортированный диапазон.
  4. Удаляет дублирующиеся элементы, как если бы выполнялось:
    auto zv = std::views::zip(c.keys, c.values);auto it = ranges::unique(zv, key_equiv(compare)).begin();auto dist = std::distance(zv.begin(), it);c.keys.erase(c.keys.begin() + dist, c.keys.end());c.values.erase(c.values.begin() + dist, c.values.end());
При слиянии на месте может выделяться память.
Если несколько элементов диапазона имеют ключи, сравнивающиеся как эквивалентные, не определено, какой из элементов будет вставлен (рассматривается в LWG2844).
8) Вставляет элементы из диапазона [first, last), последовательно выполняя следующие операции:
  1. Добавляет элементы в c, как если бы выполнялось
    for (; first != last; ++first){value_type value = *first;c.keys.insert(c.keys.end(), std::move(value.first));c.values.insert(c.values.end(), std::move(value.second));}
  2. Объединяет отсортированный диапазон только что добавленных элементов с отсортированным диапазоном ранее существовавших элементов в один отсортированный диапазон.
  3. Удаляет дублирующиеся элементы, как если бы выполнялось:
    auto zv = std::views::zip(c.keys, c.values);auto it = ranges::unique(zv, key_equiv(compare)).begin();auto dist = std::distance(zv.begin(), it);c.keys.erase(c.keys.begin() + dist, c.keys.end());c.values.erase(c.values.begin() + dist, c.values.end());
При слиянии на месте может выделяться память.
Если несколько элементов диапазона имеют ключи, сравнивающиеся как эквивалентные, не определено, какой из элементов будет вставлен (рассматривается в LWG2844).
9) Вставляет элементы из списка инициализации ilist. Эквивалентно insert(ilist.begin(), ilist.end());.
Если несколько элементов диапазона имеют ключи, сравнивающиеся как эквивалентные, не определено, какой из элементов будет вставлен (рассматривается в LWG2844).
10) Вставляет элементы из списка инициализации ilist. Эквивалентно insert(s, ilist.begin(), ilist.end());.
Если несколько элементов диапазона имеют ключи, сравнивающиеся как эквивалентные, не определено, какой из элементов будет вставлен (рассматривается в LWG2844).

Параметры

pos - итератор на позицию, перед которой будет вставлен новый элемент
value - значение элемента для вставки
first, last - пара итераторов, задающая исходный диапазон элементов для вставки
ilist - список инициализации, из которого нужно вставить значения
x - значение любого типа, которое можно прозрачно сравнить с ключом
s - тег для снятия неоднозначности, указывающий, что входная последовательность отсортирована (относительно value_comp()) и содержит только уникальные элементы
Требования к типам
-InputIt должен удовлетворять требованиям LegacyInputIterator.

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

1,2) Пара, состоящая из итератора на вставленный элемент (или на элемент, помешавший вставке) и значения bool, равного true тогда и только тогда, когда вставка состоялась.
3,4) Итератор на вставленный элемент или на элемент, помешавший вставке.
5) Пара, состоящая из итератора на вставленный элемент (или на элемент, помешавший вставке) и значения bool, равного true тогда и только тогда, когда вставка состоялась.
6) Итератор на вставленный элемент или на элемент, помешавший вставке.
7-10) (нет)

Исключения

1-6) Если любая операция выбрасывает исключение, вставка не оказывает эффекта.

Сложность

1-6) Линейная относительно size().
7) N + M·log(M), где N — это size() до операции, а M — std::distance(first, last).
8) Линейная относительно size().
9) N + M·log(M), где N — это size() до операции, а M — ilist.size().
10) Линейная относительно N, где N — это size() после операции.

Примечания

Вставка с подсказкой (3,4,6) не возвращает логическое значение, чтобы сигнатура была совместима с позиционной вставкой в последовательные контейнеры, такие как std::vector::insert. Это позволяет создавать универсальные вставители, например std::inserter. Один из способов проверить успешность вставки с подсказкой — сравнить size() до и после операции.

Пример

См. также

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

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

Spec-Zone.ru

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