Namespaces
Variants

std::flat_set<Key,Compare,KeyContainer>:: 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 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) pos の直前の位置にできるだけ近い位置に value を挿入します。 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 ) ) .
x から key_type への変換は、オブジェクト u を構築しなければならず、そのオブジェクトに対して find ( k ) == find ( u ) true でなければならない。そうでない場合、動作は未定義である。
これらのオーバーロードは、以下の条件が満たされる場合にのみオーバーロード解決に参加します:
  • 修飾名 Compare::is_transparent が有効であり型を表す場合、および
  • std:: is_constructible_v < value_type, K > true である場合
これら2つの条件により、 Key のインスタンスを構築せずにこの関数を呼び出すことが可能になります。
6) 以下の操作シーケンスと等価:
  1. 範囲 [ first , last ) から要素を c. insert ( c. end ( ) , first, last ) ; によって挿入する。
  2. 新しく挿入された要素の範囲を compare に関してソートする。
  3. 結果のソート済み範囲と既存要素のソート済み範囲を単一のソート済み範囲にマージする(注:マージ操作はメモリを割り当てる可能性がある)。
  4. 連続する等価要素のグループから最初の要素以外をすべて削除する。
範囲内に比較上等価なキーを持つ複数の要素が存在する場合、どの要素が挿入されるかは未規定です(保留中 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 - 挿入する要素のソース範囲を定義するイテレータのペア range
ilist - 値を挿入する初期化子リスト
x - キーと透過的に比較可能な任意の型の値
s - 入力シーケンスがソート済み( compare に関して)で、一意の要素のみを含むことを示す 曖昧性解消タグ
型要件
-
InputIt LegacyInputIterator の要件を満たさなければならない。

戻り値

1,2) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
3-5) 挿入された要素、または挿入を妨げた要素へのイテレータ。
6) (なし)
7) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
8-10) (なし)

例外

1-5,7) 例外が任意の操作によってスローされた場合、挿入は無効となります。

計算量

1,2) 要素数 size() に対数時間、さらに c への挿入コストを加算した時間計算量
3-5) 挿入が pos の直前に発生する場合は償却定数時間、 size() に対して対数時間。さらに c への挿入コストが加算されます。
6) N + M·log ( M ) 、ここで N は操作前の size() M std:: distance ( first, last ) です。
7) size() の対数に加えて、 c への挿入コスト。
8) N に対して線形。ここで N は操作後の size() です。
9) N + M·log ( M ) 、ここで N は操作前の size() M ilist. size ( ) です。
10) N に対して線形。ここで N は操作後の size() です。

注記

ヒント付き挿入 ( 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()); // 有効なイテレータです
    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); // 同じイテレータ
    assert(*result_2.first == 3);
    if (!result_2.second)
        std::cout << "no insertion\n";
}

出力:

insert done
no insertion

関連項目

要素をその場で構築する
(公開メンバ関数)
ヒントを使用して要素をその場で構築する
(公開メンバ関数)
引数から推論された型の std::insert_iterator を作成する
(関数テンプレート)