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