• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <vector>

    std::vector::erase

    iterator erase(iterator position);                 // (1) C++03
    iterator erase(const_iterator position);           // (1) C++11
    constexpr iterator erase(const_iterator position); // (1) C++20
    
    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++20
    

    概要

    指定した要素を削除する。

    要件

    • TはMoveAssignableでなければならない。

    効果

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

    削除された要素またはそれ以降の要素を指すイテレータや参照は無効になる。

    戻り値

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

    計算量

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

    備考

    コピーコンストラクタ、ムーブコンストラクタ、代入演算子、ムーブ代入演算子が例外を投げる場合を除いて、この関数は例外を投げない。

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

    #include <iostream>
    #include <vector>
    
    void print(const char* name, const std::vector<int>& v)
    {
      std::cout << name << " : {";
    
      bool first = true;
      for (int x : v) {
        if (first) {
          first = false;
        }
        else {
          std::cout << ", ";
        }
    
        std::cout << x;
      }
      std::cout << "}" << std::endl;
    }
    
    int main()
    {
      // (1)
      {
        std::vector<int> v = {1, 2, 3, 4, 5};
    
        // 2番目の単一要素(値3)を削除
        v.erase(v.begin() + 2);
        print("(1)", v);
      }
    
      // (2)
      {
        std::vector<int> v = {1, 2, 3, 4, 5};
    
        // 範囲[v.begin(), v.begin() + 2)の要素を削除
        v.erase(v.begin(), v.begin() + 2);
        print("(2)", v);
      }
    }
    

    出力

    (1) : {1, 2, 4, 5}
    (2) : {3, 4, 5}
    

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

    #include <iostream>
    #include <vector>
    
    int main()
    {
      std::vector<int> v = {3, 1, 4};
    
      // イテレート中に要素削除をするような場合には、
      // 範囲for文は使用できない
      for (auto it = v.begin(); it != v.end();) {
        // 条件一致した要素を削除する
        if (*it == 1) {
          // 削除された要素の次を指すイテレータが返される。
          it = v.erase(it);
        }
        // 要素削除をしない場合に、イテレータを進める
        else {
          ++it;
        }
      }
    
      for (const auto& x : v) {
        std::cout << x << std::endl;
      }
    }
    

    出力

    3
    4
    

    関連項目

    参照