Si consideri il seguente scenario:Utilizzando negazione della UnaryPredicate in erase-remove idioma
bool is_odd(int i)
{
return (i % 2) != 0;
}
int main()
{
// ignore the method of vector initialization below.
// assume C++11 is not to be used.
std::vector<int> v1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::vector<int> v2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// removes all odd numbers, OK
v1.erase(std::remove_if(v1.begin(), v1.end(), is_odd), v1.end());
// remove all even numbers
v2.erase(std::remove_if(v2.begin(), v2.end(), ???), v2.end());
}
Posso usare lo stesso is_odd()
UnaryPredicate per rimuovere i numeri come previsto nell'ultima riga della main()
. Oppure dovrò dare necessariamente una is_even()
anche se non sarà altro che:
bool is_even(int i)
{
!is_odd(i);
}
Se si dispone di C++ 11, un lambda è più semplice: '[] (int i) {return is_odd (i); } ', e direi più chiaro di qualcosa come' not1'. – BoBTFish
scusa ho notato il = prima delle parentesi graffe –
@HumamHelfawi: anche con '=' il codice precedente richiede C++ 11! Non esiste un modo diretto per inizializzare un 'std :: vector' (o qualsiasi altro contenitore di libreria standard) con una sequenza di elementi in C++ prima di C++ 11. Il modo per farlo sarebbe la creazione di un array e quindi l'uso degli iteratori nell'array con il costrutto del contenitore. –