È molto fastidioso che copy_if
non sia in C++. Qualcuno sa se sarà in C++ 0x?stanno aggiungendo copy_if in C++ 0x?
risposta
Poiché il C++ 0x non è ancora finalizzato, è possibile dare solo un'occhiata al più recente draft.
dolce raptor Gesù, è così. – rlbond
A questo punto, C++ 0x è abbastanza ben finalizzato e la bozza più recente è vicina a ciò che sarà la versione finale. –
Sono d'accordo, stavo solo leggendo che gcc 4.4 ha già qualche supporto per la bozza. –
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.
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);
});
FWIW, è stato lasciato fuori della norma per per errore :-) – dirkgently