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

履歴 編集

function
<list>

std::list::erase

iterator erase(iterator position);       // (1) C++03
iterator erase(const_iterator position); // (1) C++11
iterator erase(iterator position,
               iterator last);           // (2) C++03
iterator erase(const_iterator position,
               const_iterator last);     // (2) C++11

概要

指定された要素をコンテナから削除する。

要件

第1引数positionが間接参照可能なイテレータであること

効果

  • (1) : positionが指す要素が削除される。
  • (2) : イテレータ範囲[position, last)の要素が削除される。

戻り値

削除された要素の次の要素を指すイテレータを返す。そのような要素が存在しない場合は、end()を返す。

例外

投げない

計算量

削除される要素の数と同じ回数のTのデストラクタが実行される。

基本的な使い方 (C++11)

#include <iostream>
#include <list>
#include <iterator>

int main()
{
  // 1引数版
  {
    std::list<int> ls = {1, 2, 3, 4, 5};

    // 4を削除
    ls.erase(std::next(ls.begin(), 3));

    for (int x : ls) { std::cout << x << ' '; }
  }
  std::cout << std::endl;

  // 2引数版
  {
    std::list<int> ls = {1, 2, 3, 4, 5};

    // 3以降を削除
    ls.erase(std::next(ls.begin(), 2), ls.end());

    for (int x : ls) { std::cout << x << ' '; }
  }
}

出力

1 2 3 5 
1 2 

イテレート中に要素を削除する (C++11)

#include <iostream>
#include <list>

int main()
{
  std::list<int> ls = {3, 1, 4};

  // イテレート中に要素削除をするような場合には、
  // 範囲for文は使用できない
  for (auto it = ls.begin(); it != ls.end();) {
    // 条件一致した要素を削除する
    if (*it == 1) {
      // 削除された要素の次を指すイテレータが返される。
      it = ls.erase(it);
    }
    // 要素削除をしない場合に、イテレータを進める
    else {
      ++it;
    }
  }

  for (const auto& x : ls) {
    std::cout << x << std::endl;
  }
}

出力

3
4

参照