Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: 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 P >
std:: pair < iterator, bool > insert ( P && x ) ;
(5) (自 C++23 起)
template < class P >
iterator insert ( const_iterator pos, P && x ) ;
(6) (自 C++23 起)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(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) * this 已包含与 x 透明比较 等价 的元素,则不执行任何操作。否则,将 x 插入到 * this 中,如同通过 emplace ( std:: forward < P > ( x ) ) ; 执行插入。此重载仅当 std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > true 时参与重载决议。
6) * this 已包含与 x 透明比较 等价 的元素,则不执行任何操作。否则,将 x 插入到 * this 中尽可能接近 pos 前位置的位置。等效于 return emplace_hint ( pos, std:: forward < P > ( x ) ) ; 。此重载仅当 std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > true 时参与重载决议。
7) 插入范围 [ first , last ) 中的元素,按顺序执行以下操作:
  1. c 添加元素,如同执行:
    for ( ; first ! = last ; ++ first )
    {
    value_type value = * first ;
    c. keys . insert ( c. keys . end ( ) , std :: move ( value. first ) ) ;
    c. values . insert ( c. values . end ( ) , std :: move ( value. second ) ) ;
    }
  2. 根据 value_comp 对新插入的元素范围进行排序。
  3. 将生成的已排序范围与原有元素的已排序范围合并为单个有序范围。
  4. 擦除重复元素,如同执行:
    auto zv = std :: views:: zip ( c. keys , c. values ) ;
    auto it = ranges:: unique ( zv, key_equiv ( compare ) ) . begin ( ) ;
    auto dist = std:: distance ( zv. begin ( ) , it ) ;
    c. keys . erase ( c. keys . begin ( ) + dist, c. keys . end ( ) ) ;
    c. values . erase ( c. values . begin ( ) + dist, c. values . end ( ) ) ;
原地合并操作期间可能分配内存。
如果范围内多个元素的键比较等价,则未指定插入哪个元素(待解决 LWG2844 )。
8) 插入范围 [ first , last ) 中的元素,按顺序执行以下操作:
  1. c 添加元素,如同执行:
    for ( ; first ! = last ; ++ first )
    {
    value_type value = * first ;
    c. keys . insert ( c. keys . end ( ) , std :: move ( value. first ) ) ;
    c. values . insert ( c. values . end ( ) , std :: move ( value. second ) ) ;
    }
  2. 将新添加元素的已排序范围与已存在元素的已排序范围合并为单个有序范围。
  3. 擦除重复元素,如同执行:
    auto zv = std :: views:: zip ( c. keys , c. values ) ;
    auto it = ranges:: unique ( zv, key_equiv ( compare ) ) . begin ( ) ;
    auto dist = std:: distance ( zv. begin ( ) , it ) ;
    c. keys . erase ( c. keys . begin ( ) + dist, c. keys . end ( ) ) ;
    c. values . erase ( c. values . begin ( ) + dist, c. values . end ( ) ) ;
原地合并操作期间可能分配内存。
如果范围内多个元素的键比较等价,则未指定插入哪个元素(待解决 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 - 指示输入序列已排序(相对于 value_comp() )且仅包含唯一元素的消歧义标签
类型要求
-
InputIt 必须满足 LegacyInputIterator 的要求。

返回值

1,2) 返回一个由迭代器和布尔值组成的对:迭代器指向被插入的元素(或阻止插入的元素),布尔值当且仅当插入成功时被设为 true
3,4) 指向被插入元素的迭代器,或指向阻止插入的元素的迭代器。
5) 一个由迭代器和布尔值组成的对:迭代器指向被插入的元素(或阻止插入的元素),布尔值当且仅当插入成功时被设为 true
6) 指向被插入元素的迭代器,或指向阻止插入的元素的迭代器。
7-10) (无)

异常

1-6) 若任何操作抛出异常,则插入操作无效。

复杂度

1-6) size() 呈线性关系。
7) N + M·log ( M ) ,其中 N 表示操作前的 size() M 表示 std:: distance ( first, last )
8) size() 呈线性关系。
9) N + M·log ( M ) ,其中 N 表示操作前的 size() M ilist. size ( )
10) N 呈线性关系,其中 N 是操作后的 size()

注释

提示插入 ( ( 3,4 ) ( 6 ) ) 不返回布尔值,这是为了与顺序容器(如 std::vector::insert )的位置插入操作保持签名兼容。这使得创建通用插入器(如 std::inserter )成为可能。检查提示插入是否成功的一种方法是比较插入前后 size() 的值。

示例

参见

原地构造元素
(公开成员函数)
使用提示原地构造元素
(公开成员函数)
插入元素,若键已存在则赋值给当前元素
(公开成员函数)
创建从参数推断类型的 std::insert_iterator
(函数模板)