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

来自cppreference.com
< cpp‎ | container‎ | 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))
x 转换为 key_type 必然构造一个对象 u,使得 find(k) == find(u)true。否则,其行为未定义。
这些重载只有在
  • 限定标识 Compare::is_transparent 有效并代表一个类型,并且
  • std::is_constructible_v<value_type, K>true
时才会参与重载决议。这些条件共同允许不构造 Key 的实例就可以调用这个函数。
6) 等价于下列操作的序列:
  1. 如同用 c.insert(c.end(), first, last); 插入来自范围 [firstlast) 的元素。
  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) 由一个指向被插入元素(或指向妨碍插入的元素)的迭代器和一个当且仅当发生插入时被设为 truebool 值构成的对偶。
3-5) 指向被插入元素或指向妨碍插入的元素的迭代器。
6) (无)
7) 由一个指向被插入元素(或指向妨碍插入的元素)的迭代器和一个当且仅当发生插入时被设为 truebool 值构成的对偶。
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()); // 这是有效迭代器
    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
(函数模板)