das folgende Szenario vor:von UnaryPredicate in Lösch-remove Idiom Mit Negation
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());
}
Kann ich die gleichen is_odd()
UnaryPredicate verwenden, auch Zahlen zu entfernen, wie in der letzten Zeile der main()
erwartet. Oder werde ich muss unbedingt ein is_even()
schreiben, obwohl es nichts sein, aber:
bool is_even(int i)
{
!is_odd(i);
}
Wenn Sie ++ haben C 11, eine Lambda ist am einfachsten: '[] (int i) {return is_odd (i); } ', und ich würde klarer behaupten als etwas wie' not1'. – BoBTFish
Entschuldigung bemerkte die = vor den geschweiften Klammern –
@HumamHelfawi: selbst mit dem '=' der obige Code erfordert C++ 11! Es gibt keinen direkten Weg, einen 'std :: vector' (oder einen der anderen Standard-Bibliothekscontainer) mit einer Sequenz von Elementen in C++ vor C++ 11 zu initialisieren. Der Weg dazu wäre die Erstellung eines Arrays und dann die Verwendung von Iteratoren für das Array mit dem Konstrukt des Containers. –