erase-remove idiom

std::remove は実際には要素を削除しないよという話。 remove は第三引数と同じ値の要素をコンテナの末尾に移動して、残った要素の最後の反復子を返すだけなので、コンテナのサイズは変化しない。

コンテナから本当に削除したければ erase を組み合わせて使う必要がある。 unique なんかもそうですね。

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

struct print {
    void operator()(int n) { cout << n << endl; }
};

int main()
{
    std::vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

    arr.erase(std::remove(arr.begin(), arr.end(), 2), arr.end());
    std::for_each(arr.begin(), arr.end(), print());

    return 0;
}

最近読んでいるブログに書いてあって知ったのだけれど、これを erase-remove idiom とか呼ぶらしい *1 。よく使う手法には大抵名前が付いているものなのですね。 unique の場合は erase-unique idiom とでも呼ぶのかな。

これも職場の人がはまっていたもの。

*1:http://cpptruths.blogspot.com/2006/04/stl-short-one-liners.html