名前空間
変種
操作

std::list<T,Allocator>::insert

From cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
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 の前に範囲 [firstlast) から要素を挿入します。

このオーバーロードは、InputIt が整数型の場合、オーバーロード (3) と同じ効果を持ちます。

(C++11まで)

このオーバーロードは、オーバーロード (3) との曖昧さを避けるため、InputItLegacyInputIterator の要件を満たす場合にのみオーバーロード解決に参加します。

(C++11以降)
firstlast*this 内のイテレータである場合、動作は未定義です。
5) pos の前に初期化リスト ilist から要素を挿入します。

イテレータや参照は無効化されない。

目次

[編集] パラメータ

pos - 挿入される要素の前のイテレータ (posend() イテレータでもよい)
value - 挿入する要素の値
count - 挿入する要素の数
first, last - 挿入する要素の 範囲 を定義するイテレータのペア(挿入対象のコンテナ内のイテレータは指定できません)
ilist - 値を挿入するための std::initializer_list
型要件
-
オーバーロード (1) を使用するには、TCopyInsertable の要件を満たす必要があります。
-
オーバーロード (2) を使用するには、TMoveInsertable の要件を満たす必要があります。
-
オーバーロード (3) を使用するには、TCopyAssignable および CopyInsertable の要件を満たす必要があります。
-
オーバーロード (4,5) を使用するには、TEmplaceConstructible の要件を満たす必要があります。


[編集] 戻り値

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 を作成する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)