Ich möchte Elemente aus einem Vektor mit remove_if
function entfernen, aber das Löschen auf N Elemente beschränken.
Beispiel:
%Vor% Ich brauche, dass IsOdd
Prädikat speichert, wie viele Elemente es entfernt hat und wie viele wir löschen möchten.
Der einzige Weg ist, eine globale Variable zu verwenden? So:
Der Status "Wie viele Elemente wurden bisher entfernt" sollte außerhalb der Funktion / des Aufrufs des Algorithmus definiert werden. Dies liegt daran, dass ein Funktor keinen Zustand haben sollte, der beim Aufruf geändert wird (dies wäre ein undefiniertes Verhalten).
Sie sollten einen Verweis auf diesen Status (Zähler) im Konstruktor des Funktors nehmen (oder durch Referenz im Lambda erfassen), damit Sie auf diesen Zähler zugreifen und diesen ändern können. Wenn dieser Funktor nun kopiert wird, spielt es keine Rolle, welcher Algorithmus vom Algorithmus aufgerufen wird, da alle den Verweis auf den gleichen Zustand enthalten.
Verwenden von Funktoren (C ++ 03):
%Vor%Verwenden von Lambda (C ++ 11):
%Vor%Neben dem Erstellen eines eigenen Funktors können Sie einen Lambda-Ausdruck übergeben:
%Vor%Beachten Sie jedoch, dass statusbehaftete Funktoren und Standard-Bibliotheksalgorithmen nicht immer gut gemischt sind . Hier können Aufrufe an das Lambda einen Nebeneffekt haben, so dass Sie nicht garantieren können, dass Elemente in der Sequenz entfernt werden.
Beachten Sie den letzten Aufruf von std::vector::erase
. Dies ist erforderlich, um die unerwünschten Elemente wirklich aus dem Container zu entfernen. Siehe Erase Remove Idiom .
Der Code in der gewählten Antwort hat einen kleinen Fehler. Es fehlen Klammern vor dem Operator-Schlüsselwort. Ich konnte die Bearbeitung nicht mit weniger als sechs Zeichen durchführen und konnte keinen Kommentar abgeben, da meine Punktzahl zu niedrig ist.
%Vor%