最終更新日時(UTC):
が更新

履歴 編集

function
<forward_list>

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

iterator insert_after(const_iterator position, const T& x); // (1)
iterator insert_after(const_iterator position, T&& x);      // (2)
iterator insert_after(const_iterator position, size_type n,
                      const T& x);                          // (3)

template <class InputIterator>
iterator insert_after(const_iterator position,
                      InputIterator first,
                      InputIterator last);                  // (4)

iterator insert_after(const_iterator position,
                      initializer_list<T> il);              // (5)

概要

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

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

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

要件

戻り値

  • (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から。

参照