std::flat_set<Key,Compare,KeyContainer>::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 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) 將 value 插入到儘可能接近 pos 之前的某個位置。等效於 return emplace_hint(pos, value);。
4) 將 value 插入到儘可能接近 pos 之前的某個位置。等效於 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))。
這些過載僅在以下情況下參與過載解析:
- 限定 id
Compare::is_transparent
有效並表示一個型別,並且 - std::is_constructible_v<value_type, K> 為 true,
Key
例項的情況下呼叫此函式。6) 等效於以下操作序列:
- 插入範圍
[
first,
last)
中的元素,如同透過 c.insert(c.end(), first, last);。 - 根據
compare
對新插入元素的範圍進行排序。 - 將產生的已排序範圍與預先存在的元素的已排序範圍合併為單個已排序範圍。(注意:合併操作可能會分配記憶體)。
- 從每組連續等效元素中刪除除第一個元素之外的所有元素。
如果範圍中有多個元素具有比較等效的鍵,則插入哪個元素是未指定的(待定 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) 如果任何操作丟擲異常,則插入無效。
本節不完整 原因:情況 6,8-10 |
[編輯] 複雜度
1-5)
size()
的線性複雜度。7)
size()
的線性複雜度。本節不完整 原因:重新檢查複雜度:1-5、7、9、10。查詢是 log(N),但在底層容器中插入平均為 N/2 => 線性。 |
[編輯] 注意
帶提示的插入 (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()); // it is a valid iterator 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); // the same iterator assert(*result_2.first == 3); if (!result_2.second) std::cout << "no insertion\n"; }
輸出
insert done no insertion
[編輯] 另見
就地構造元素 (公共成員函式) | |
使用提示就地構造元素 (公共成員函式) | |
建立從引數推斷型別的std::insert_iterator (函式模板) |