std::set<Key,Compare,Allocator>:: insert
|
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 に要素を挿入します。
| (C++11以降) |
[
first
,
last
)
から要素を挿入します。
|
(C++11以降) |
- first または last が * this を指すイテレータである場合。
ilist.begin()
から
ilist.end()
までの範囲を
insert
(
ilist.
begin
(
)
, ilist.
end
(
)
)
と同等です。
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 である場合。
-
Compareが 透過的 (transparent) であること。 - std:: is_convertible_v < K && , const_iterator > が false であること。
- std:: is_convertible_v < K && , iterator > が false であること。
イテレータおよび参照は無効化されません。 挿入が成功した場合、ノードハンドル内に保持されている間に取得された要素へのポインタおよび参照は無効化され、抽出前にその要素に対して取得されたポインタおよび参照は有効になります。 (C++17以降)
目次 |
パラメータ
| pos | - | 新しい要素が挿入される位置の前を指すイテレータ |
| value | - | 挿入する要素の値 |
| first, last | - | 挿入する要素のソース範囲を定義するイテレータのペア range |
| ilist | - | 値の挿入元となる初期化子リスト |
| nh | - | 互換性のある node handle |
| x | - | キーと透過的に比較可能な任意の型の値 |
| 型要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければならない。
|
||
戻り値
insert_return_type
のオブジェクト:
-
nh
が空の場合、
insertedは false 、positionは end ( ) 、nodeは空となる。 -
挿入が行われた場合、
insertedは true 、positionは挿入された要素を指し、nodeは空となる。 -
挿入が失敗した場合、
insertedは false 、nodeは nh の前の値を持ち、positionは nh. key ( ) と等価なキーを持つ要素を指す。
例外
単一の要素の挿入中にいずれかの操作によって例外がスローされた場合、挿入は無効となります。
計算量
与えられた N を size ( ) として:
注記
ヒント付き挿入
(
(
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)
|
要素をその場で構築する
(公開メンバ関数) |
|
(C++11)
|
ヒントを使用して要素をその場で構築する
(公開メンバ関数) |
|
引数から推論された型の
std::insert_iterator
を作成する
(関数テンプレート) |