std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert
來自 cppreference.com
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<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) 插入來自範圍
[
first,
last)
的元素,如同順序執行以下操作:- 將元素新增到
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));
} - 根據
value_comp
對新插入的元素範圍進行排序。 - 將結果排序的範圍與預先存在的元素的排序範圍合併成一個單一的排序範圍。
- 刪除重複的元素,如同透過
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)
的元素,如同順序執行以下操作:- 將元素新增到
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));
} - 將新新增元素的已排序範圍和預先存在元素的已排序範圍合併為單個已排序範圍。
- 刪除重複的元素,如同透過
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) 如果任何操作丟擲異常,則插入無效。
本節不完整 原因:案例 7-10 |
[編輯] 複雜度
1-6) 與
size()
成線性關係。8) 與
size()
成線性關係。[編輯] 注意
提示插入 (3,4,6) 不返回布林值,以便與順序容器(如 std::vector::insert)上的位置插入簽名相容。這使得建立通用插入器(如 std::inserter)成為可能。檢查提示插入是否成功的一種方法是比較插入前後 size()
的值。
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參閱
就地構造元素 (公共成員函式) | |
使用提示就地構造元素 (公共成員函式) | |
插入元素或如果鍵已存在則賦值給當前元素 (公共成員函式) | |
建立從引數推斷型別的std::insert_iterator (函式模板) |