2009-04-27 9 views

Respuesta

7

Como C++ 0x aún no está finalizado, solo puede echar un vistazo a la más reciente draft.

+2

raptor dulce Jesús, ahí está. – rlbond

+1

Por ahora, C++ 0x está bastante bien finalizado, y el borrador más reciente está muy cerca de lo que será la versión final. –

+0

Acepto, estaba leyendo que gcc 4.4 ya tiene algo de apoyo para el borrador. –

5

Mientras tanto, no es muy difícil de hacer su propio copy_if() usando 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())); 

Usando not1() requiere su clase de predicados para suministrar un tipo anidado, argument_type, que identifica el tipo del argumento - como como se muestra arriba, una forma conveniente de hacerlo es derivar de unary_function<T, U>, donde T es el tipo de argumento.

4

simplemente para la corrección, en caso de que alguien googles su/su camino a esta pregunta, se debe mencionar que ahora (en C++ 11 y posteriores) existe un algoritmocopy if. Se comporta como se esperaba (copia los elementos en un rango, para los cuales algún predicado devuelve verdadero, a otro rango).

Un caso de uso típico sería

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); 
      });