C++
 Computer >> コンピューター >  >> プログラミング >> C++

特定の値を持つ要素をC++ STLベクトルから削除する方法

C++のSTL(Standard Template Library)におけるstd::vectorから、特定の値を持つ要素を削除するには、erase()関数を使用します。本記事では、基本的な使い方から、特定の値をすべて削除する「erase–removeイディオム」まで、実例とともに解説します。

erase()関数の基本

erase()関数は、引数として渡されたイテレータが指す位置の要素を削除します。また、範囲を指定することで複数の要素を一度に削除することも可能です。

  • 単一要素の削除: v.erase(it) — イテレータitが指す要素を削除します。
  • 範囲指定の削除: v.erase(first, last)firstからlastの手前までの要素を削除します。

なお、要素が削除されると後続の要素が前に詰められ、削除された位置以降のイテレータは無効になる点に注意が必要です。

アルゴリズム

Begin
    ベクトルvとそのイテレータitを宣言する。
    ベクトルを初期化する。
    erase()関数で末尾の要素を削除する。
    残りの要素を出力する。
End.

サンプルコード:末尾の要素を削除する

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v{ 6, 7, 8, 9, 10 };
    vector<int>::iterator it;

    // 末尾の要素を指すイテレータを取得して削除
    it = v.end();
    it--;
    v.erase(it);

    // 残りの要素を出力
    for (auto it = v.begin(); it != v.end(); ++it)
        cout << ' ' << *it;

    return 0;
}

出力結果

6 7 8 9

特定の値を持つ要素をすべて削除する(erase–removeイディオム)

値が一致する要素だけを削除したい場合は、std::remove()erase()を組み合わせた「erase–removeイディオム」を使うのが定番です。remove()は実際には要素を削除せず、削除対象以外の要素を前方に移動させるだけなので、続けてerase()を呼び出す必要があります。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v{ 6, 7, 8, 7, 9, 10, 7 };

    // 値が7の要素をすべて削除
    v.erase(remove(v.begin(), v.end(), 7), v.end());

    cout << "削除後のベクトルの内容:";
    for (auto it = v.begin(); it != v.end(); ++it)
        cout << ' ' << *it;

    return 0;
}

出力結果

削除後のベクトルの内容:6 8 9 10

C++20以降なら std::erase も使える

C++20では、より簡潔に書けるstd::erase(v, value)および条件を指定できるstd::erase_if(v, predicate)が追加されました。これにより、erase–removeイディオムを意識せずに直感的な記述が可能になっています。

std::erase(v, 7);                    // 値が7の要素をすべて削除
std::erase_if(v, [](int x){ return x % 2 == 0; }); // 偶数をすべて削除

まとめ

  • erase()関数で、イテレータまたは範囲を指定して要素を削除できます。
  • 特定の値を持つ要素をまとめて削除する場合は、remove()との組み合わせ(erase–removeイディオム)が伝統的な手法です。
  • C++20以降ではstd::erase()std::erase_if()を使うことで、より簡潔かつ安全に記述できます。
  1. 【C++】文字列から特定の文字を削除する方法(erase・remove活用)

    この記事では、C++で文字列から特定の文字を削除する方法を解説します。C++では、標準ライブラリの erase() 関数と remove() 関数を組み合わせることで、この処理を非常に簡単に実装できます。remove() 関数は、文字列の先頭と末尾を指すイテレータ、および削除したい文字を引数として受け取ります。ただし、remove() 単体では要素が実際に削除されるわけではなく、削除対象以外の文字を前方へ移動させるだけです。そのため、文字列から完全に取り除くには、erase() と組み合わせる「erase-remove イディオム」を使うのが定番の手法です。入力:文字列 ABAABACCABA

  2. C#でArrayListから要素を削除する方法

    C#でArrayListから要素を削除するには、Remove()メソッドを使用します。まず、新しいArrayListを作成し、いくつかの要素を追加してみましょう。ArrayList arr = new ArrayList(); arr.Add(Jones); arr.Add(Tom); arr.Add(Henry);続いて、要素「Tom」を削除します。これにはRemove()メソッドを呼び出すだけでOKです。arr.Remove(Tom);Remove()メソッドは、引数に指定したオブジェクトと一致する最初の要素をリストから取り除きます。一致する要素が見つからない場合でも例外はスローされず、リ