最終更新日時: 2026年02月17日 23時22分33秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<deque>

# std::deque::erase

    iterator erase(iterator position);                         // (1) C++03
    iterator erase(const_iterator position);                   // (1) C++11
    constexpr iterator erase(const_iterator position);         // (1) C++26

    iterator erase(iterator first, iterator last);                       // (2) C++03
    iterator erase(const_iterator first, const_iterator last);           // (2) C++11
    constexpr iterator erase(const_iterator first, const_iterator last); // (2) C++26

## 概要

指定した要素を削除する。`deque`は、シーケンスの終端または先頭からの要素の削除(と追加)が効果的となるよう設計されている。他の位置からの削除は通常、`list`コンテナよりも効率で劣る。

## 効果

- (1) : `position`が指す要素を削除する。
- (2) : イテレータ範囲`[first, last)`の要素を削除する。

もし削除がシーケンスの先頭または末尾から行われた場合、削除された要素へのイテレータと参照だけが無効化される（そのほかの要素への参照/イテレータは有効であり続ける）。一方、削除が中間位置から行われた場合は全てのイテレータと参照が無効化される。

## 戻り値

削除された要素の次の要素を指すイテレータを返す。そのような要素が存在しない場合は、`end()`を返す。さらに、削除された要素以降の要素の数と同じ回数の`T`のムーブ代入演算子が呼ばれる。

## 計算量

削除された要素の数に対して線形時間（デストラクタ呼び出し）。加えて、`position`と終端位置の間にある要素の数に対してライブラリの実装に依存して線形時間で増加する。

## 例

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

    #include <iostream>
    #include <deque>

    int main()
    {
      // 単一要素の削除
      {
        std::deque<int> c = {3, 1, 4};
        c.erase(c.begin()); // 先頭要素を削除する

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

      // 範囲の削除
      {
        std::deque<int> c = {3, 1, 4};
        c.erase(c.begin(), c.begin() + 2); // 先頭2要素を削除

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

#### 出力

    1
    4

    4

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

    #include <iostream>
    #include <deque>

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

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

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

#### 出力

    3
    4

## 参照

- N2350 Container insert/erase and iterator constness (Revision 1)
- LWG Issue 638. `deque` end invalidation during erase
- P3372R3 constexpr containers and adaptors