これはSTLで最悪の名前の関数でしょうか?(レトリックの質問)
std :: remove_copy_if()は、実際には削除を行っていないようです。私が知る限り、それはcopy_if_notのように動作します。
否定は少し紛らわしいですが、std :: not1()で回避できますが、この関数が削除と何の関係があるのか理解できないため、何かを誤解している可能性があります-何かが欠けていますか?
そうでない場合、コンテナから要素を条件付きで削除(移動?)して別のコンテナに配置するためのSTLアルゴリズムはありますか?
読者が混乱しないように編集して例を追加します。
次のプログラムは、入力範囲(V1)をそのままにしておくように見えます。
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using std::cout;
using std::endl;
int main (void)
{
std::vector<int> V1, V2;
V1.push_back(-2);
V1.push_back(0);
V1.push_back(-1);
V1.push_back(0);
V1.push_back(1);
V1.push_back(2);
std::copy(V1.begin(), V1.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
std::remove_copy_if(
V1.begin(),
V1.end(),
std::back_inserter(V2),
std::bind2nd(std::less<int>(), 0));
std::copy(V2.begin(), V2.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
std::copy(V1.begin(), V1.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
}
以下を出力します。
-2 0 -1 0 1 2
0 0 1 2
-2 0 -1 0 1 2
私は期待していたので、次のようなものを参照してください:
-2 0 -1 0 1 2
0 0 1 2
0 0 1 2 ? ? ?
どこ ?任意の値にすることができます。しかし、入力範囲が変更されておらず、戻り値が(この場合)std :: vector :: Erase()で使用できないことに驚きました。(戻り値は出力イテレータです。)