Namespaces
Variants

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 ) )
x key_type 的转换必须构造一个对象 u ,使得 find ( k ) == find ( u ) 成立。否则行为是未定义的。
这些重载仅在满足以下条件时参与重载决议:
  • 限定标识符 Compare::is_transparent 有效且表示一个类型,且
  • std:: is_constructible_v < value_type, K > true
这两个条件共同允许在不构造 Key 实例的情况下调用此函数。
6) 等价于以下操作序列:
  1. 插入来自范围 [ first , last ) 的元素,如同执行 c. insert ( c. end ( ) , first, last ) ;
  2. 根据 compare 对新插入的元素范围进行排序。
  3. 将新生成的已排序范围与原有元素的已排序范围合并为单一有序范围(注意:合并操作可能分配内存)。
  4. 从每组连续相等元素中擦除除首个元素外的所有元素。
如果范围内多个元素的键比较等价,则未指定插入哪个元素(待解决 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) 如果任何操作抛出异常,则插入操作无效。

复杂度

1,2) size() 成对数关系,加上插入到 c 的代价。
3-5) 若插入发生在 pos 之前的位置,则摊还常数时间复杂度;否则为 size() 的对数时间复杂度。另需加上插入到 c 中的开销。
6) N + M·log ( M ) ,其中 N 表示操作前的 size() M 表示 std:: distance ( first, last )
7) size() 呈对数关系,加上插入 c 的代价。
8) N 呈线性关系,其中 N 是操作后的 size()
9) N + M·log ( M ) ,其中 N 表示操作前的 size() M 表示 ilist. 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 << "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
(函数模板)