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 起) |
将元素(s)插入容器中,如果容器中不包含具有相同键的元素。
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) 一个包含指向插入元素(或阻止插入的元素)的迭代器和一个 bool 值的 pair,该值仅当插入成功时才设置为 true。
3-5) 指向插入元素或阻止插入的元素的迭代器。
6) (无)
7) 一个包含指向插入元素(或阻止插入的元素)的迭代器和一个 bool 值的 pair,该值仅当插入成功时才设置为 true。
8-10) (无)
[编辑] 异常
1-5,7) 如果任何操作抛出异常,则插入无效。
本节内容不完整 原因: cases 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()); // it is a valid iterator 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); // the same iterator assert(*result_2.first == 3); if (!result_2.second) std::cout << "no insertion\n"; }
输出
insert done no insertion
[编辑] 另请参阅
在位置构造元素 (公有成员函数) | |
使用提示在位置构造元素 (公有成员函数) | |
创建一个根据参数推断类型的 std::insert_iterator (函数模板) |