Namespaces
Variants

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

From cppreference.net
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) value pos の直前の位置に可能な限り近い位置に挿入します。 return emplace_hint ( pos, std :: move ( value ) ) ; と等価です。
5) もし * this が既に 等価 と透過的に比較される要素を含む場合、何もしません。それ以外の場合、 x * this に以下のように挿入します: emplace ( std:: forward < P > ( x ) ) ; 。このオーバーロードは、 std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > true の場合にのみオーバーロード解決に参加します。
6) もし * this が既に 透過的に比較して等価 な要素を保持している場合、何も行わない。そうでない場合、 x * this pos の直前の位置にできるだけ近い位置に挿入する。以下と等価: return emplace_hint ( pos, std:: forward < P > ( x ) ) ; 。このオーバーロードは、 std:: is_constructible_v < std:: pair < key_type, mapped_type > , P > true の場合にのみオーバーロード解決に参加する。
7) 範囲 [ first , last ) から要素を挿入し、以下の操作を順次実行するかのように動作します:
  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) 範囲 [ first , last ) から要素を挿入し、以下の操作を順次実行するかのように動作します:
  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 - 挿入する要素のソース範囲を定義するイテレータのペア range
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() M std:: distance ( first, last ) です。
8) size() に対して線形。
9) N + M·log ( M ) 、ここで N は操作前の size() M ilist. size ( ) です。
10) N に対して線形。ここで N は操作後の size() です。

注記

ヒント付き挿入 ( ( 3,4 ) および ( 6 ) )は、 std::vector::insert のようなシーケンシャルコンテナに対する位置指定挿入とのシグネチャ互換性を保つため、ブール値を返しません。これにより、 std::inserter のような汎用インサーターを作成することが可能になります。ヒント付き挿入の成功を確認する一つの方法は、挿入前後の size() を比較することです。

関連項目

要素をその場で構築する
(公開メンバ関数)
ヒントを使用して要素をその場で構築する
(公開メンバ関数)
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(公開メンバ関数)
引数から推論された型の std::insert_iterator を作成する
(関数テンプレート)