std::vector<T,Allocator>::insert
From cppreference.com
iterator insert( const_iterator pos, const T& value ); |
(1) | (C++20 以降 constexpr) |
iterator insert( const_iterator pos, T&& value ); |
(2) | (C++11以降) (C++20 以降 constexpr) |
iterator insert( const_iterator pos, size_type count, const T& value ); |
(3) | (C++20 以降 constexpr) |
template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last ); |
(4) | (C++20 以降 constexpr) |
iterator insert( const_iterator pos, std::initializer_list<T> ilist ); |
(5) | (C++11以降) (C++20 以降 constexpr) |
指定された位置に要素を挿入します。
1) pos の前に value のコピーを挿入します。
2) pos の前に value を挿入します。ムーブセマンティクスを使用する場合があります。
3) pos の前に value のコピーを count 個挿入します。
4) pos の前に範囲
[first, last) から要素を挿入します。|
このオーバーロードは、 |
(C++11まで) |
|
このオーバーロードは、オーバーロード (3) との曖昧さを避けるため、 |
(C++11以降) |
first と last が *this 内のイテレータである場合、動作は未定義です。
5) pos の前に初期化リスト ilist から要素を挿入します。
操作後、新しい size() が古い capacity() より大きくなった場合、再割り当てが行われ、その場合、すべてのイテレータ(end() イテレータを含む)および要素へのすべての参照が無効になります。それ以外の場合、挿入ポイントより前のイテレータと参照のみが有効のままになります。
目次 |
[編集] パラメータ
| pos | - | 挿入するコンテンツの前のイテレータ(pos は end() イテレータの場合もあります) |
| value | - | 挿入する要素の値 |
| count | - | 挿入する要素の数 |
| first, last | - | 挿入する要素の 範囲 を定義するイテレータのペア(挿入対象のコンテナ内のイテレータは指定できません) |
| ilist | - | 値を挿入するための std::initializer_list |
| 型要件 | ||
-オーバーロード (1) を使用するには、T は CopyAssignable および CopyInsertable の要件を満たす必要があります。 | ||
-オーバーロード (2) を使用するには、T は MoveAssignable および MoveInsertable の要件を満たす必要があります。 | ||
-オーバーロード (3) を使用するには、T は CopyAssignable および CopyInsertable の要件を満たす必要があります。 | ||
-オーバーロード (4,5) を使用するには、T は EmplaceConstructible の要件を満たす必要があります。 | ||
-オーバーロード (4) を使用するには、T は MoveAssignable および MoveInsertable の要件を満たす必要があります。InputIt が LegacyInputIterator を満たすが LegacyForwardIterator を満たさない場合にのみ必要です。 (C++17 まで) | ||
-オーバーロード (4,5) を使用するには、T は Swappable、MoveAssignable、MoveConstructible、MoveInsertable の要件を満たす必要があります。 (C++17 以降) | ||
[編集] 戻り値
1,2) 挿入された value を指すイテレータ。
3) 挿入された最初の要素を指すイテレータ。または count = 0 の場合は pos。
4) 挿入された最初の要素を指すイテレータ。または first = last の場合は pos。
5) 挿入された最初の要素を指すイテレータ。または ilist が空の場合は pos。
[編集] 計算量
1,2) 定数時間プラス、pos とコンテナの末尾の間の距離に比例する時間。
3) count に比例する時間プラス、pos とコンテナの末尾の間の距離に比例する時間。
5) ilist.size() に比例する時間プラス、pos とコンテナの末尾の間の距離に比例する時間。
[編集] 例外
以下以外の例外がスローされた場合:
Tのコピーコンストラクタ、
|
(C++11以降) |
Tのコピー代入演算子、
|
(C++11以降) |
- 任意の
InputIt操作、
これらの関数は効果がありません(強力な例外安全性保証)。
|
末尾に単一の要素を挿入する際に例外がスローされ、 |
(C++11以降) |
例
このコードを実行
#include <iostream> #include <iterator> #include <string_view> #include <vector> namespace stq { void println(std::string_view rem, const std::vector<int>& container) { std::cout << rem.substr(0, rem.size() - 2) << '['; bool first{true}; for (const int x : container) std::cout << (first ? first = false, "" : ", ") << x; std::cout << "]\n"; } } int main() { std::vector<int> c1(3, 100); stq::println("1. {}", c1); auto pos = c1.begin(); pos = c1.insert(pos, 200); // overload (1) stq::println("2. {}", c1); c1.insert(pos, 2, 300); // overload (3) stq::println("3. {}", c1); // pos no longer valid, get a new one: pos = c1.begin(); std::vector<int> c2(2, 400); c1.insert(std::next(pos, 2), c2.begin(), c2.end()); // overload (4) stq::println("4. {}", c1); int arr[] = {501, 502, 503}; c1.insert(c1.begin(), arr, arr + std::size(arr)); // overload (4) stq::println("5. {}", c1); c1.insert(c1.end(), {601, 602, 603}); // overload (5) stq::println("6. {}", c1); }
出力
1. [100, 100, 100] 2. [200, 100, 100, 100] 3. [300, 300, 200, 100, 100, 100] 4. [300, 300, 400, 400, 200, 100, 100, 100] 5. [501, 502, 503, 300, 300, 400, 400, 200, 100, 100, 100] 6. [501, 502, 503, 300, 300, 400, 400, 200, 100, 100, 100, 601, 602, 603]
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 149 | C++98 | オーバーロード (3) と (4) は何も返さなかった | イテレータを返す |
| LWG 247 | C++98 | 計算量はオーバーロード (3) のみに指定されていた | すべてのオーバーロードに指定された |
| LWG 406 | C++98 | 強力な例外保証は、以下の場合にも適用された 例外が InputIt 操作によってスローされた場合 |
この場合、保証なし |
[編集] 関連項目
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| 末尾に要素を追加する (公開メンバ関数) | |
| 引数から推論された型の std::insert_iterator を作成する (関数テンプレート) |