It\'s very annoying that copy_if
is not in C++. Does anyone know if it will be in C++0x?
In the meantime, it's not very hard to make your own copy_if()
using remove_copy_if()
:
#include <functional>
struct my_predicate : std::unary_function<my_arg_type, bool> {
bool operator()(my_arg_type const& x) const { ... }
};
// To perform "copy_if(x, y, z, my_predicate())", write:
remove_copy_if(x, y, z, std::not1(my_predicate()));
Using not1()
requires your predicate class to supply a nested type, argument_type
, identifying the type of the argument -- as shown above, one convenient way to do this is to derive from unary_function<T, U>
, where T
is the argument type.
Since the C++0x is not yet finalized, you can only take a look at the most recent draft.
Just for completeness, in case someone googles his/her way to this question, it should be mentioned that now (in C++11 and later) there is a copy if algorithm. It behaves as expected (copies the elements in a range, for which some predicate returns true, to another range).
A typical use case would be
std::vector<int> foo{ 25, 15, 5, -5, -15 };
std::vector<int> bar;
// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar),
[](int i){return !(i<0);
});