Namespaces
Variants

std::flat_set<Key,Compare,KeyContainer>:: insert

From cppreference.net
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,2) Логарифмическая сложность от size() , плюс стоимость вставки в c .
3-5) Амортизированная константа, если вставка происходит в позицию непосредственно перед pos , логарифмическая по size() в остальных случаях. Плюс стоимость вставки в c .
6) N + M·log ( M ) , где N — это size() до операции, а M — это std:: distance ( first, last ) .
7) Логарифмическая от size() , плюс стоимость вставки в c .
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()); // это валидный итератор
    assert(*result_1.first == 3);
    if (result_1.second)
        std::cout << "вставка выполнена\n";
    auto result_2 = set.insert(3);
    assert(result_2.first == result_1.first); // тот же итератор
    assert(*result_2.first == 3);
    if (!result_2.second)
        std::cout << "вставка не выполнена\n";
}

Вывод:

вставка выполнена
вставка не выполнена

Смотрите также

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