std::list<T,Allocator>::insert
From cppreference.com
iterator insert( const_iterator pos, const T& value ); |
(1) | |
iterator insert( const_iterator pos, T&& value ); |
(2) | (C++11以降) |
iterator insert( const_iterator pos, size_type count, const T& value ); |
(3) | |
template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last ); |
(4) | |
iterator insert( const_iterator pos, std::initializer_list<T> ilist ); |
(5) | (C++11以降) |
指定された位置に要素を挿入します。
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 から要素を挿入します。
イテレータや参照は無効化されない。
目次 |
[編集] パラメータ
| pos | - | 挿入される要素の前のイテレータ (pos は end() イテレータでもよい) |
| value | - | 挿入する要素の値 |
| count | - | 挿入する要素の数 |
| first, last | - | 挿入する要素の 範囲 を定義するイテレータのペア(挿入対象のコンテナ内のイテレータは指定できません) |
| ilist | - | 値を挿入するための std::initializer_list |
| 型要件 | ||
-オーバーロード (1) を使用するには、T は CopyInsertable の要件を満たす必要があります。 | ||
-オーバーロード (2) を使用するには、T は MoveInsertable の要件を満たす必要があります。 | ||
-オーバーロード (3) を使用するには、T は CopyAssignable および CopyInsertable の要件を満たす必要があります。 | ||
-オーバーロード (4,5) を使用するには、T は EmplaceConstructible の要件を満たす必要があります。
| ||
[編集] 戻り値
1,2) 挿入された value を指すイテレータ。
3) 挿入された最初の要素を指すイテレータ。または count = 0 の場合は pos。
4) 挿入された最初の要素を指すイテレータ。または first = last の場合は pos。
5) 挿入された最初の要素を指すイテレータ。または ilist が空の場合は pos。
[編集] 計算量
1,2) 定数時間。
3) count に対して線形時間。
4) std::distance(first, last) に対して線形時間。
5) ilist.size() に対して線形時間。
[編集] 例外
何らかの理由で例外がスローされた場合、これらの関数は効果がありません(強力な例外安全性保証)。
例
このコードを実行
#include <iostream> #include <iterator> #include <string_view> #include <list> namespace stq { void println(std::string_view rem, const std::list<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::list<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); // reset pos to the begin: pos = c1.begin(); std::list<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) は何も返さなかった | イテレータを返す |
[編集] 関連項目
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| 先頭に要素を挿入する (公開メンバ関数) | |
| 末尾に要素を追加する (公開メンバ関数) | |
| 引数から推論された型の std::insert_iterator を作成する (関数テンプレート) |