Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

are they adding copy_if to c++0x?

It's very annoying that copy_if is not in C++. Does anyone know if it will be in C++0x?

like image 362
rlbond Avatar asked Apr 27 '09 16:04

rlbond


3 Answers

Since the C++0x is not yet finalized, you can only take a look at the most recent draft.

like image 140
Burkhard Avatar answered Nov 17 '22 08:11

Burkhard


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.

like image 5
j_random_hacker Avatar answered Nov 17 '22 07:11

j_random_hacker


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);
          });
like image 4
Nikos Athanasiou Avatar answered Nov 17 '22 07:11

Nikos Athanasiou