命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | container‎ | 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)

如果容器中不存在具有等效键的元素,则将元素(s)插入容器中。

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<pair<key_type, mapped_type>, P>true 时,此重载才参与重载解析。
6) 如果 *this 已经包含一个与 x 透明比较等效的元素,则不执行任何操作。否则,将 x 插入 *this,在尽可能靠近 pos 之前的 位置。等效于 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
3,4) 指向插入的元素或阻止插入的元素的迭代器。
5) 一个对,由指向插入的元素(或阻止插入的元素)的迭代器和一个 bool 值组成,该值仅当插入成功时才设置为 true
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
(函数模板) [编辑]