命名空间
变体
操作

std::flat_set<Key,Compare,KeyContainer>::insert

来自 cppreference.cn
< cpp‎ | 容器‎ | flat set
 
 
 
 
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))
xkey_type 的转换必须构造一个对象 u,对于该对象,find(k) == find(u)true。否则,行为是未定义的。
这些重载仅在以下情况下参与重载解析:
  • 限定 id Compare::is_transparent 有效并表示一个类型,并且
  • std::is_constructible_v<value_type, K>true
两者一起允许在不构造 Key 实例的情况下调用此函数。
6) 等效于以下操作序列:
  1. 插入范围 [firstlast) 中的元素,如同通过 c.insert(c.end(), first, last);
  2. 根据 compare 对新插入元素的范围进行排序。
  3. 将产生的已排序范围与预先存在的元素的已排序范围合并为单个已排序范围。(注意:合并操作可能会分配内存)。
  4. 从每组连续等效元素中删除除第一个元素之外的所有元素。
如果范围中有多个元素具有比较等效的键,则插入哪个元素是未指定的(待定 LWG2844)。
8) 插入范围 [firstlast) 中的元素。等效于 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) 如果任何操作抛出异常,则插入无效。

[编辑] 复杂度

1-5) size() 的线性复杂度。
6) N + M·log(M),其中 N 是操作前的 size()Mstd::distance(first, last)
7) size() 的线性复杂度。
8) N 的线性复杂度,其中 N 是操作后的 size()
9) N + M·log(M),其中 N 是操作前的 size()Milist.size()
10) N 的线性复杂度,其中 N 是操作后的 size()

[编辑] 注意

带提示的插入 (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
(函数模板) [编辑]