Spec-Zone.ru › C++

std::flat_set<Key,Compare,KeyContainer>::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 K >
iterator insert( const_iterator pos, K&& x );
(5) (начиная с C++23)
template< class InputIt >
void insert( InputIt first, InputIt last );
(6) (начиная с C++23)
template< class K >
std::pair<iterator, bool> insert( K&& x );
(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,7) Если *this уже содержит элемент, прозрачно сравниваемый как эквивалентный x, ничего не делает. В противном случае вставляет новый элемент, как если бы было выполнено:
  • (5) emplace(pos, std::forward<K>(x)) (в позицию, максимально близкую к позиции непосредственно перед pos);
  • (7) emplace(std::forward<K>(x)).
Преобразование x в key_type должно создавать объект u, для которого find(k) == find(u) является true. В противном случае поведение не определено.
Эти перегрузки участвуют в разрешении перегрузки только если
  • квалифицированный идентификатор Compare::is_transparent допустим и обозначает тип, и
  • std::is_constructible_v<value_type, K> является true,
что вместе позволяет вызвать эту функцию без создания экземпляра Key.
6) Эквивалентно последовательности операций:
  1. Вставляет элементы из диапазона [first, last), как если бы было выполнено c.insert(c.end(), first, last);.
  2. Сортирует диапазон вновь вставленных элементов относительно compare.
  3. Объединяет полученный отсортированный диапазон и отсортированный диапазон ранее существовавших элементов в один отсортированный диапазон. (Примечание: операция объединения может выделять память).
  4. Удаляет все элементы, кроме первого, из каждой группы идущих подряд эквивалентных элементов.
Если ключи нескольких элементов в диапазоне сравниваются как эквивалентные, не указано, какой именно элемент будет вставлен (ожидается рассмотрение LWG2844).
8) Вставляет элементы из диапазона [first, last). Эквивалентно insert(first, last);.
Если ключи нескольких элементов в диапазоне сравниваются как эквивалентные, не указано, какой именно элемент будет вставлен (ожидается рассмотрение 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 - тег для устранения неоднозначности, указывающий, что входная последовательность отсортирована (относительно compare) и содержит только уникальные элементы
Требования к типам
-InputIt должен соответствовать требованиям LegacyInputIterator.

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

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

Исключения

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

Сложность

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

Примечания

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

Пример

#include <cassert>
#include <flat_set>
#include <iostream>

int main()
{
    std::flat_set<int> set;

    auto result_1 = set.insert(3);
    assert(result_1.first != set.end()); // it is a valid iterator
    assert(*result_1.first == 3);
    if (result_1.second)
        std::cout << "insert done\n";

    auto result_2 = set.insert(3);
    assert(result_2.first == result_1.first); // the same iterator
    assert(*result_2.first == 3);
    if (!result_2.second)
        std::cout << "no insertion\n";
}

Вывод:

insert done
no insertion

См. также

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

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

Spec-Zone.ru

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