2009-04-27 4 views

risposta

7

Poiché il C++ 0x non è ancora finalizzato, è possibile dare solo un'occhiata al più recente draft.

+2

dolce raptor Gesù, è così. – rlbond

+1

A questo punto, C++ 0x è abbastanza ben finalizzato e la bozza più recente è vicina a ciò che sarà la versione finale. –

+0

Sono d'accordo, stavo solo leggendo che gcc 4.4 ha già qualche supporto per la bozza. –

5

Nel frattempo, non è molto difficile da fare il vostro proprio copy_if() utilizzando 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())); 

Utilizzando not1() richiede la classe predicato di fornire un tipo nidificato, argument_type, che identifica il tipo dell'argomento - come mostrato sopra, un modo conveniente per farlo è quello di derivare da unary_function<T, U>, dove T è il tipo di argomento.

4

Solo per completezza, in caso qualcuno googles sua/il suo modo a questa domanda, va detto che la società (in C++ 11 e versioni successive) c'è un copy if algoritmo. Si comporta come previsto (copia gli elementi in un intervallo, per il quale alcuni predicati restituiscono true, a un altro intervallo).

Un tipico caso d'uso sarebbe

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