std::set<Key,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | (自 C++26 起为 constexpr) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(2) |
(自 C++11 起)
(自 C++26 起为 constexpr) |
| (3) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(C++11 前) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(自 C++11 起)
(自 C++26 起为 constexpr) |
|
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(4) |
(自 C++11 起)
(自 C++26 起为 constexpr) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(5) | (自 C++26 起为 constexpr) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(6) |
(自 C++11 起)
(自 C++26 起为 constexpr) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(7) |
(自 C++17 起)
(自 C++26 起为 constexpr) |
|
iterator insert
(
const_iterator pos, node_type
&&
nh
)
;
|
(8) |
(自 C++17 起)
(自 C++26 起为 constexpr) |
|
template
<
class
K
>
std:: pair < iterator, bool > insert ( K && x ) ; |
(9) |
(自 C++23 起)
(自 C++26 起为 constexpr) |
|
template
<
class
K
>
iterator insert ( const_iterator pos, K && x ) ; |
(10) |
(自 C++23 起)
(自 C++26 起为 constexpr) |
尝试将元素插入到 * this 中。
- 如果 * this 已包含具有等效键的元素,则不执行任何操作。
- 否则,将元素插入到 * this 中。
| (C++11 起) |
[
first
,
last
)
的元素。
|
(since C++11) |
- first 或 last 是指向 * this 的迭代器。
value_type
的对象
u
,使用
std::
forward
<
K
>
(
x
)
,然后将
u
插入到
*
this
中。在构造
u
之前,会使用
x
透明地确定等效键是否存在。
-
value_type无法通过 std:: forward < K > ( x ) 置入构造到set中。 - equal_range ( u ) == equal_range ( x ) 为 false 。
-
Compare是 透明 的。 - std:: is_convertible_v < K && , const_iterator > 为 false 。
- std:: is_convertible_v < K && , iterator > 为 false 。
不会使任何迭代器或引用失效。 若插入成功,则通过节点句柄持有该元素期间获得的指针和引用将失效,而该元素被提取之前获得的指针和引用将变为有效。 (C++17 起)
目录 |
参数
| pos | - | 指向新元素将插入位置之前的迭代器 |
| value | - | 要插入的元素值 |
| first, last | - | 定义要插入元素源 范围 的迭代器对 |
| ilist | - | 要从中插入值的初始化列表 |
| nh | - | 兼容的 节点句柄 |
| 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 ) 通常实现为循环调用以 end() 作为提示位的重载版本 ( 3 ) ;这些重载针对追加有序序列(例如另一个 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++标准。
| 缺陷报告 | 应用于 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 233 | C++98 | pos 仅作为提示,可能被完全忽略 |
要求插入位置尽可能接近
pos 之前的位置 |
| LWG 264 | C++98 |
重载版本
(
5
)
在区间
[
first
,
last
)
按
Compare
排序时需要线性复杂度
|
移除此特殊场景下的
线性复杂度要求 |
| LWG 316 | C++98 |
重载版本
(
1
)
的返回值中
未明确哪个 bool 值表示插入成功 |
成功由 true 表示 |
参见
|
(C++11)
|
原地构造元素
(公开成员函数) |
|
(C++11)
|
使用提示原地构造元素
(公开成员函数) |
|
创建从参数推断类型的
std::insert_iterator
(函数模板) |