特定のプロパティを持つ要素をstd::vector
コンテナーまたは他のコンテナーから削除するタスクは、機能的なスタイルの実装に適しています。ループ、メモリの割り当て解除、データの移動を正しく行う必要はありません。
ただし、C++ でこれを行う標準的な方法は、次のイディオムのようです。
std::vector<int> ints;
...
ints.erase(
std::remove_if(ints.begin(),
ints.end(),
[](int x){return x < 0;}),
ints.end());
この例では、ゼロ未満のすべての要素を整数ベクトルから削除します。
醜いだけでなく、間違った使い方も簡単だと思います。std::remove_if
渡された反復子のみを取得するため、ベクトルのサイズを (その名前が示すように) 変更できないことは明らかです。しかし、私を含む多くの開発者は、最初はそれを理解していません。
では、これを達成するためのより安全で、できればよりエレガントな方法はありますか? そうでない場合、なぜですか?