🙆‍♀️

[C++] vectorの要素削除はErase–removeイディオムを使おう

2023/11/25に公開

本日は最近覚えたErase-removeイディオムをアウトプットしてみようと思う。

Erase-removeイディオムとは

vectorから特定の要素を削除する際に以下のようにstd::removeとvectorのeraseメソッドを組み合わせて削除する実装方法だ。

std::vector<int> vec { 0, 1, 2, 3, 4, 5};
vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());
Print(vec); // 0 1 3 4 5

※Printは引数のvectorの全ての要素を標準出力する自作のサブ関数。

このイディオムを使うことでvectorから指定した特定の要素だけ削除することができる。

Erase-removeイディオムが必要な理由

なぜeraseとremoveを組み合わせないといけないかというと、std::removeだけの動作を見てみると分かる。
以下はeraseを行わずにstd::removeだけ実行した後場合の動作。

std::vector<int> vec { 0, 1, 2, 3, 4, 5};
std::remove(vec.begin(), vec.end(), 2), vec.end();
Print(vec); // 0 1 3 4 5 5

結果を見てもらえばわかる通り、2は削除されたが代わりに末尾に5が追加されてしまっている。そう、std::removeは要素を削除するが要素数を切り詰めたりはしてくれないのだ。
調べてみるとvectorの一番最後の要素が後ろに代わりに追加されるのが仕様らしい。

基本的にに要素を削除したい場合は要素数も減らして欲しいことがほとんどのはずなので、Erase-removeメソッドで対応するべきだろう。

Discussion