std::set<Key,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | (constexpr начиная с C++26) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(2) |
(начиная с C++11)
(constexpr начиная с C++26) |
| (3) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(до C++11) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(начиная с C++11)
(constexpr начиная с C++26) |
|
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(4) |
(начиная с C++11)
(constexpr начиная с C++26) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(5) | (constexpr начиная с C++26) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(6) |
(начиная с C++11)
(constexpr начиная с C++26) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(7) |
(начиная с C++17)
(constexpr начиная с C++26) |
|
iterator insert
(
const_iterator pos, node_type
&&
nh
)
;
|
(8) |
(начиная с C++17)
(constexpr начиная с C++26) |
|
template
<
class
K
>
std:: pair < iterator, bool > insert ( K && x ) ; |
(9) |
(начиная с C++23)
(constexpr начиная с C++26) |
|
template
<
class
K
>
iterator insert ( const_iterator pos, K && x ) ; |
(10) |
(начиная с C++23)
(constexpr начиная с C++26) |
Пытается вставить элемент(ы) в * this .
- Если * this уже содержит элемент с эквивалентным ключом, ничего не делает.
- В противном случае, вставляет элемент(ы) в * this .
| (since C++11) |
[
first
,
last
)
.
|
(начиная с C++11) |
- first или last является итератором на * this .
value_type
с помощью
std::
forward
<
K
>
(
x
)
и затем вставляет
u
в
*
this
. Существование эквивалентного ключа определяется прозрачно с использованием
x
перед созданием
u
.
-
value_typeне является EmplaceConstructible вsetиз std:: forward < K > ( x ) . - equal_range ( u ) == equal_range ( x ) равно false .
-
Compareявляется прозрачным . - std:: is_convertible_v < K && , const_iterator > имеет значение false .
- std:: is_convertible_v < K && , iterator > имеет значение false .
Никакие итераторы или ссылки не инвалидируются. Если вставка успешна, указатели и ссылки на элемент, полученные пока он содержался в node handle, инвалидируются, а указатели и ссылки, полученные на этот элемент до его извлечения, становятся валидными. (since C++17)
Содержание |
Параметры
| pos | - | итератор на позицию, перед которой будет вставлен новый элемент |
| value | - | значение элемента для вставки |
| first, last | - | пара итераторов, определяющая исходный диапазон элементов для вставки |
| ilist | - | список инициализации для вставки значений |
| nh | - | совместимый node handle |
| x | - | значение любого типа, которое можно прозрачно сравнивать с ключом |
| Требования к типам | ||
-
InputIt
должен удовлетворять требованиям
LegacyInputIterator
.
|
||
Возвращаемое значение
insert_return_type
с инициализированными членами следующим образом:
-
Если
nh
пуст,
insertedравен false ,positionравен end ( ) , иnodeпуст. -
Иначе, если вставка произошла,
insertedравен true ,positionуказывает на вставленный элемент, иnodeпуст. -
Если вставка не удалась,
insertedравен false ,nodeсодержит предыдущее значение nh , иpositionуказывает на элемент с ключом, эквивалентным nh. key ( ) .
Исключения
Если при выполнении любой операции во время вставки отдельного элемента возникает исключение, вставка не оказывает никакого эффекта.
Сложность
Дано N как size ( ) :
Примечания
Подсказанная вставка
(
(
3,4
)
,
(
8
)
и
(
10
)
)
не возвращает булево значение для совместимости по сигнатуре с позиционной вставкой в последовательных контейнерах, таких как
std::vector::insert
. Это позволяет создавать универсальные вставщики, такие как
std::inserter
. Один из способов проверки успешности подсказанной вставки — сравнение
size()
до и после операции.
Перегрузки ( 5,6 ) часто реализуются как цикл, вызывающий перегрузку ( 3 ) с end() в качестве подсказки; они оптимизированы для добавления отсортированной последовательности (такой как другой std::set ), чей наименьший элемент больше последнего элемента в * this .
Если несколько элементов в диапазоне имеют эквивалентные ключи, не определено, какой элемент будет вставлен (в ожидании LWG2844 ).
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion
|
202311L
|
(C++26) | Гетерогенные перегрузки для оставшихся функций-членов в упорядоченных и неупорядоченных ассоциативных контейнерах. ( 9,10 ) |
Пример
#include <cassert> #include <iostream> #include <set> int main() { std::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 << "insert done\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 << "no insertion\n"; }
Вывод:
insert done no insertion
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 233 | C++98 | pos был просто подсказкой, его можно было полностью игнорировать |
вставка должна быть
как можно ближе к позиции непосредственно перед pos |
| LWG 264 | C++98 |
сложность перегрузки
(
5
)
должна была быть линейной, если
диапазон
[
first
,
last
)
отсортирован согласно
Compare
|
убрано требование линейной сложности
в этом специальном случае |
| LWG 316 | C++98 |
в возвращаемом значении перегрузки
(
1
)
не было указано,
какое значение bool указывает на успешную вставку |
успех указывается значением true |
Смотрите также
|
(C++11)
|
создаёт элемент на месте
(public member function) |
|
(C++11)
|
создаёт элементы на месте с использованием подсказки
(public member function) |
|
создаёт
std::insert_iterator
типа, выведенного из аргумента
(function template) |