std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::insert
From 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` と透過的に同等とみなされる要素を含んでいる場合、何も行いません。そうでなければ、`emplace(std::forward<P>(x))` と同様に `x` を `*this` に挿入します。このオーバーロードは、`std::is_constructible_v<pair<key_type, mapped_type>, P>` が `true` の場合にのみオーバーロード解決に参加します。
6) `*this` が既に `x` と透過的に同等とみなされる要素を含んでいる場合、何も行いません。そうでなければ、`pos` の直前となるべく近い位置に `x` を挿入します。`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、それ以外の場合は false となります。
3,4) 挿入された要素、または挿入を妨げた要素へのイテレータ。
5) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ `true` に設定される `bool` 値からなるペア。
6) 挿入された要素、または挿入を妨げた要素へのイテレータ。
7-10) (なし)
[編集] 例外
1-6) いずれかの操作で例外がスローされた場合、挿入は効果がありません。
| このセクションは未完成です 理由:ケース 7-10 |
[編集] 計算量
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) 操作後の `size()` である `N` に対して線形。
[編集] 注釈
ヒント付き挿入(3,4,6)は、`std::vector::insert` のようなシーケンシャルコンテナの位置指定挿入とシグネチャ互換性を持たせるために、ブール値を返しません。これにより、`std::inserter` のようなジェネリックインサータを作成することが可能になります。ヒント付き挿入の成功を確認する一つの方法は、操作前後の `size()` を比較することです。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| 要素を直接構築する (公開メンバ関数) | |
| ヒントを使用して要素を直接構築する (公開メンバ関数) | |
| 要素を挿入するか、キーが既に存在する場合は現在の要素に代入する (public member function) | |
| 引数から推論された型の std::insert_iterator を作成する (関数テンプレート) |