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)
在尽可能接近
pos
之前位置处插入
value
。等价于
return
emplace_hint
(
pos, value
)
;
。
4)
在尽可能接近
pos
之前位置处插入
value
。等价于
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 ) ) 。
这些重载仅在满足以下条件时参与重载决议:
-
限定标识符
Compare::is_transparent有效且表示一个类型,且 - std:: is_constructible_v < value_type, K > 为 true ,
Key
实例的情况下调用此函数。
6)
等价于以下操作序列:
-
插入来自范围
[first,last)的元素,如同执行 c. insert ( c. end ( ) , first, last ) ; 。 -
根据
compare对新插入的元素范围进行排序。 - 将新生成的已排序范围与原有元素的已排序范围合并为单一有序范围(注意:合并操作可能分配内存)。
- 从每组连续相等元素中擦除除首个元素外的所有元素。
如果范围内多个元素的键比较等价,则未指定插入哪个元素(待解决
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)
返回一个由迭代器和布尔值组成的对:迭代器指向被插入的元素(或阻止插入的元素),布尔值当且仅当插入成功时被设为
true
。
3-5)
指向被插入元素的迭代器,或指向阻止插入的元素的迭代器。
6)
(无)
7)
一个由迭代器和布尔值组成的对:迭代器指向被插入的元素(或阻止插入的元素),布尔值当且仅当插入成功时被设为
true
。
8-10)
(无)
异常
1-5,7)
如果任何操作抛出异常,则插入操作无效。
|
本节内容不完整
原因:案例 6,8-10 |
复杂度
注释
提示插入
(
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 << "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
参见
|
原地构造元素
(公开成员函数) |
|
| td> 使用提示原地构造元素 | |
|
创建从参数推断类型的
std::insert_iterator
(函数模板) |