Может ли это быть наихудшей названной функцией в 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(). (Возвращаемое значение является выходным итератором.)