命名空间
变体
操作

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert

来自 cppreference.cn
< cpp‎ | 容器‎ | flat_map
 
 
 
 
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 透明比较等价的元素,则不做任何事。否则,如同以 emplace(std::forward<P>(x)); 方式将 x 插入到 *this 中。此重载仅若 std::is_constructible_v<pair<key_type, mapped_type>, P>true 时才参与重载决议。
6)*this 已经含有与 x 透明比较等价的元素,则不做任何事。否则,在尽可能接近刚好在 pos 之前的位置处将 x 插入到 *this 中。等价于 return emplace_hint(position, std::forward<P>(x));。此重载仅若 std::is_constructible_v<pair<key_type, mapped_type>, P>true 时才参与重载决议。
7) 从范围 [firstlast) 插入元素,如同顺序执行下列操作
  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) 从范围 [firstlast) 插入元素,如同顺序执行下列操作
  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) 由指向被插入元素(或阻止了插入的元素)的迭代器,和指明插入是否发生的 bool 值(若且唯若插入发生才设为 true)构成的 pair。
3,4) 指向被插入元素,或指向阻止了插入的元素的迭代器。
5) 由指向被插入元素(或阻止了插入的元素)的迭代器,和指明插入是否发生的 bool 值(若且唯若插入发生才设为 true)构成的 pair。
6) 指向被插入元素,或指向阻止了插入的元素的迭代器。
7-10) (无)

[编辑] 异常

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

[编辑] 复杂度

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

[编辑] 注解

提示插入 (3,4,6) 不返回布尔值,为了与序列容器(例如 std::vector::insert)上的位置插入签名兼容。这使得能创建通用插入器,如 std::inserter。检查提示插入成功的一种方式是在之前和之后比较 size()

[编辑] 示例

[编辑] 参见

就地构造元素
(公开成员函数) [编辑]
使用提示就地构造元素
(公开成员函数) [编辑]
若键已存在则插入元素或赋值给当前元素
(公开成员函数) [编辑]
创建从实参推导类型的 std::insert_iterator
(函数模板) [编辑]