名前空間
変種
操作

std::flat_set<Key,Compare,KeyContainer>::insert

From cppreference.com
< cpp‎ | container‎ | flat set
 
 
 
 
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) pos の直前の位置に最も近い位置に value を挿入します。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 への変換は、find(k) == find(u)true となるオブジェクト u を構築する必要があります。それ以外の場合、動作は未定義です。
これらのオーバーロードは、以下の場合にのみオーバーロード解決に参加します。
  • 修飾子付き ID Compare::is_transparent が有効で、型を指す場合、および
  • std::is_constructible_v<value_type, K>true である場合。
これにより、Key のインスタンスを構築せずにこの関数を呼び出すことができます。
6) 以下の操作のシーケンスと同等です。
  1. 範囲 [firstlast) から要素を挿入します。これは c.insert(c.end(), first, last); と同等です。
  2. 新しく挿入された要素の範囲を compare に従ってソートします。
  3. 結果として得られたソート済み範囲と、既存の要素のソート済み範囲を、単一のソート済み範囲にマージします。(注意:マージ操作はメモリを割り当てる可能性があります)。
  4. 連続する同等な要素の各グループから、最初の要素以外のすべてを削除します。
範囲内の複数の要素のキーが同等に比較される場合、どの要素が挿入されるかは未指定です(LWG2844 参照)。
8) 範囲 [firstlast) から要素を挿入します。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 に従って)ソートされており、一意の要素のみを含むことを示す 曖昧さ解消タグ
型要件
-
InputItLegacyInputIterator の要件を満たす必要があります。

[編集] 戻り値

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

[編集] 例外

1-5,7) いずれかの操作で例外がスローされた場合、挿入は効果がありません。

[編集] 計算量

1-5) size() に対して線形。
6) N は操作前の size() で、Mstd::distance(first, last) です。
7) size() に対して線形。
8) 操作後の size() である N に対して線形。
9) N は操作前の size() で、Milist.size() です。
10) 操作後の size() である N に対して線形。

[編集] 注意

ヒント付き挿入 (3-5) は、`std::vector::insert` のようなシーケンシャルコンテナのポジショナル挿入とシグネチャ互換にするためにブール値を返しません。これにより、`std::inserter` のようなジェネリックインサーターを作成できます。ヒント付き挿入の成功を確認する 1 つの方法は、操作の前と後で 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 を作成する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)