std::flat_set<Key,Compare,KeyContainer>::insert
来自cppreference.com
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))
这些重载只有在
- 限定标识 Compare::is_transparent 有效并代表一个类型,并且
- std::is_constructible_v<value_type, K> 为 true
Key
的实例就可以调用这个函数。6) 等价于下列操作的序列:
- 如同用 c.insert(c.end(), first, last); 插入来自范围
[
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 的 bool 值构成的对偶。
3-5) 指向被插入元素或指向妨碍插入的元素的迭代器。
6) (无)
7) 由一个指向被插入元素(或指向妨碍插入的元素)的迭代器和一个当且仅当发生插入时被设为 true 的 bool 值构成的对偶。
8-10) (无)
[编辑]异常
1-5,7) 如果任何操作抛出了异常,则插入无效果。
本节未完成 原因:情况 6,8-10 |
[编辑]复杂度
1-5) 与
size()
成线性。7) 与
size()
成线性。本节未完成 原因:再查一下复杂度: 1-5, 7, 9, 10。查找为 log(N),但底层容器的插入则平均为 N/2 => 线性。 |
[编辑]注解
有提示插入 (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 (函数模板) |