Namespaces
Variants

std::set<Key,Compare,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (constexpr since C++26)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (since C++11)
(constexpr since C++26)
(3)
iterator insert ( iterator pos, const value_type & value ) ;
(until C++11)
iterator insert ( const_iterator pos, const value_type & value ) ;
(since C++11)
(constexpr since C++26)
iterator insert ( const_iterator pos, value_type && value ) ;
(4) (since C++11)
(constexpr since C++26)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(5) (constexpr since C++26)
void insert ( std:: initializer_list < value_type > ilist ) ;
(6) (since C++11)
(constexpr since C++26)
insert_return_type insert ( node_type && nh ) ;
(7) (since C++17)
(constexpr since C++26)
iterator insert ( const_iterator pos, node_type && nh ) ;
(8) (since C++17)
(constexpr since C++26)
template < class K >
std:: pair < iterator, bool > insert ( K && x ) ;
(9) (since C++23)
(constexpr since C++26)
template < class K >
iterator insert ( const_iterator pos, K && x ) ;
(10) (since C++23)
(constexpr since C++26)

要素を * this に挿入しようと試みます。

  • * this が既に同等のキーを持つ要素を含む場合、何も行いません。
  • それ以外の場合、 * this に要素を挿入します。
1-4) value を挿入します。 pos が指定された場合、 value pos の直前の位置に可能な限り近く挿入されます。
1,3) value_type set CopyInsertable でない場合、動作は未定義です。
2,4) value_type set MoveInsertable でない場合、動作は未定義です。
(C++11以降)
5) 範囲 [ first , last ) から要素を挿入します。
以下のいずれかの条件が満たされる場合、動作は未定義です:
(C++11以降)
  • first または last * this を指すイテレータである場合。
6) 初期化子リストから要素を挿入 ilist
ilist.begin() から ilist.end() までの範囲を insert ( ilist. begin ( ) , ilist. end ( ) ) と同等です。
7) nh が空の node handle である場合、何も行わない。それ以外の場合、コンテナが nh. key ( ) と等価なキーを持つ要素を既に含んでいない場合、 nh が所有する要素をコンテナに挿入する。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) である場合、動作は未定義である。
8) もし nh が空の node handle であれば、何もせずにendイテレータを返す。そうでなければ、 nh が所有する要素をコンテナに挿入する。ただし、コンテナが既に nh. key ( ) と等価なキーを持つ要素を含んでいない場合に限る。挿入の成否に関わらず、 nh. key ( ) と等価なキーを持つ要素を指すイテレータを返す。挿入が成功した場合、 nh は移動され、そうでない場合は要素の所有権を保持する。要素は pos の直前の位置にできるだけ近くなるように挿入される。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) の場合、動作は未定義である。
9,10) value_type 型のオブジェクト u std:: forward < K > ( x ) で構築し、 u * this に挿入する。同等のキーの存在は、 u を構築する前に x を使用して透過的に判定される。
以下のいずれかの条件が満たされる場合、動作は未定義です:
  • value_type EmplaceConstructible ではなく、 set std:: forward < K > ( x ) から構築できない場合。
  • equal_range ( u ) == equal_range ( x ) false である場合。
9) このオーバーロードは、 Compare transparent である場合にのみ、オーバーロード解決に参加します。
10) u は、 pos の直前の位置にできるだけ近い位置に挿入されます。
このオーバーロードは、以下のすべての条件が満たされる場合にのみオーバーロード解決に参加します:

イテレータおよび参照は無効化されません。 挿入が成功した場合、ノードハンドル内に保持されている間に取得された要素へのポインタおよび参照は無効化され、抽出前にその要素に対して取得されたポインタおよび参照は有効になります。 (C++17以降)

目次

パラメータ

pos - 新しい要素が挿入される位置の前を指すイテレータ
value - 挿入する要素の値
first, last - 挿入する要素のソース範囲を定義するイテレータのペア range
ilist - 値の挿入元となる初期化子リスト
nh - 互換性のある node handle
x - キーと透過的に比較可能な任意の型の値
型要件
-
InputIt LegacyInputIterator の要件を満たさなければならない。

戻り値

1,2) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
3,4) 挿入された要素、または挿入を妨げた要素へのイテレータ。
7) 以下のように初期化されたメンバーを持つ insert_return_type のオブジェクト:
  • nh が空の場合、 inserted false position end ( ) node は空となる。
  • 挿入が行われた場合、 inserted true position は挿入された要素を指し、 node は空となる。
  • 挿入が失敗した場合、 inserted false node nh の前の値を持ち、 position nh. key ( ) と等価なキーを持つ要素を指す。
8) nhが空の場合は終端イテレータ、挿入が行われた場合は挿入された要素を指すイテレータ、失敗した場合は nh. key ( ) と同等のキーを持つ要素を指すイテレータ。
9) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
10) 挿入された要素、または挿入を妨げた要素へのイテレータ。

例外

単一の要素の挿入中にいずれかの操作によって例外がスローされた場合、挿入は無効となります。

計算量

与えられた N size ( ) として:

1,2) log(N)
3,4) 挿入が 直後 (C++11以前) 直前 (C++11以降) pos で発生する場合、償却定数時間。それ以外の場合 log(N) 時間。
5,6) log(N+M) , ここで M は挿入する要素の数です。
7) log(N)
8) 償却定数時間(挿入が pos の直前に発生する場合)、 log(N) それ以外の場合。
9) log(N)
10) 挿入が pos の直前に発生する場合、償却定数時間。 それ以外の場合、 log(N) 時間。

注記

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

オーバーロード ( 5,6 ) は、多くの場合、ヒントとして end() を指定してオーバーロード ( 3 ) を呼び出すループとして実装されます。これらは、 * this の最後の要素よりも最小要素が大きいソート済みシーケンス(別の std::set など)を追加するために最適化されています。

範囲内に比較等価なキーを持つ複数の要素がある場合、どの要素が挿入されるかは未規定です( LWG2844 未解決)。

機能テスト マクロ 標準 機能
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) 順序付き および 非順序 連想コンテナの残りのメンバー関数に対する異種型オーバーロード。 ( 9,10 )

#include <cassert>
#include <iostream>
#include <set>
int main()
{
    std::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

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 233 C++98 pos は単なるヒントであり、完全に無視される可能性があった 挿入は pos の直前の位置に
可能な限り近くなるように
行われることが要求される
LWG 264 C++98 オーバーロード ( 5 ) の計算量は、範囲 [ first , last ) Compare に従って
ソートされている場合、線形であることが要求されていた
この特別なケースにおける
線形計算量の要件を削除
LWG 316 C++98 オーバーロード ( 1 ) の戻り値において、
どの bool 値が挿入の成功を示すか
指定されていなかった
成功は true によって示される

関連項目

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