最終更新日時: 2026年03月21日 23時12分53秒 (JST)
Raclamusi が更新

履歴 編集

function
<forward_list>

# std::forward_list::insert_after(C++11)

    iterator
      insert_after(const_iterator position,
                   const T& x); // (1) C++11
    constexpr iterator
      insert_after(const_iterator position,
                   const T& x); // (1) C++26

    iterator
      insert_after(const_iterator position,
                   T&& x); // (2) C++11
    constexpr iterator
      insert_after(const_iterator position,
                   T&& x); // (2) C++26

    iterator
      insert_after(const_iterator position,
                   size_type n,
                   const T& x); // (3) C++11
    constexpr iterator
      insert_after(const_iterator position,
                   size_type n,
                   const T& x); // (3) C++26

    template <class InputIterator>
    iterator
      insert_after(const_iterator position,
                   InputIterator first,
                   InputIterator last); // (4) C++11
    template <class InputIterator>
    constexpr iterator
      insert_after(const_iterator position,
                   InputIterator first,
                   InputIterator last); // (4) C++26

    iterator
      insert_after(const_iterator position,
                   initializer_list<T> il); // (5) C++11
    constexpr iterator
      insert_after(const_iterator position,
                   initializer_list<T> il); // (5) C++26

## 概要

任意の位置に新たな要素を挿入する。

`list`の`insert()`は指定された要素の前に挿入するが、`forward_list`は指定された要素の後に挿入する。

- (1), (2) : 新たな要素をひとつ挿入する
- (3) : 新たな要素`x`のコピーを`n`個挿入する
- (4) : イテレータ範囲`[first, last)`の要素を挿入する
- (5) : `initializer_list`の全て要素を挿入する

## 要件

- 第1パラメータ`position`が、`before_begin()`もしくはイテレータ範囲`[begin(), end())`の間接参照可能なイテレータであること。
- `first`、`last`は`*this`のイテレータではないこと。

## 戻り値

- (1), (2) : 挿入された要素を指すイテレータ
- (3), (4), (5) : 最後に挿入された要素を指すイテレータ、挿入されなかった時は`position`

## 計算量

- (1), (2) : 定数時間
- (3) : `n`に対して線形時間
- (4) : `std::distance(first, last)`に対して線形時間
- (5) : `il.size()`に対して線形時間

## 例

    #include <iostream>
    #include <forward_list>
    #include <string>
    #include <iterator>
    #include <algorithm>
    #include <vector>

    template <class T>
    void print(const std::string& name, const std::forward_list<T>& ls)
    {
      std::cout << name << " : ";
      std::for_each(ls.begin(), ls.end(), [](int x) {
        std::cout << x << ' ';
      });
      std::cout << std::endl;
    }

    int main()
    {
      // ひとつの要素を挿入する
      {
        std::forward_list<int> ls = {1, 2, 4};

        // 先頭に0を挿入
        ls.insert_after(ls.before_begin(), 0);

        // 2の後ろに3を挿入
        decltype(ls)::iterator it = std::next(ls.begin(), 2);
        ls.insert_after(it, 3);

        ::print("insert one element", ls);
      }
      // n個の要素を挿入する
      {
        std::forward_list<int> ls = {1, 2, 5};

        // 2の後ろに3を2個挿入する
        ls.insert_after(std::next(ls.begin(), 1), 2, 3);

        ::print("insert n elements", ls);
      }
      // 指定範囲の要素を挿入する
      {
        std::forward_list<int> ls = {1, 2, 6};

        // vの全ての要素をlsに挿入する
        const std::vector<int> v = {3, 4, 5};
        ls.insert_after(std::next(ls.begin(), 1), v.begin(), v.end());

        ::print("insert range", ls);
      }
      // 初期化子リストで要素を挿入する
      {
        std::forward_list<int> ls = {1, 2, 6};

        ls.insert_after(std::next(ls.begin(), 1), {3, 4, 5});

        ::print("insert initializer_list", ls);
      }
    }

### 出力

    insert one element : 0 1 2 3 4
    insert n elements : 1 2 3 3 5
    insert range : 1 2 3 4 5 6
    insert initializer_list : 1 2 3 4 5 6

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅
  - (5) `initializer_list<T>`を仮引数に持つものは、2013から。

## 参照

- N2679 Initializer Lists for Standard Containers(Revision 1)
  - (5)の経緯となる提案文書
- P3372R3 constexpr containers and adaptors