Übergeben Sie zusätzliche Argumente an remove_if

7

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:

%Vor%     
dynamic 04.06.2013, 10:38
quelle

5 Antworten

11

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%     
leemes 04.06.2013, 11:10
quelle
4

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 .

    
juanchopanza 04.06.2013 10:45
quelle
2
%Vor%     
Kamouth 04.06.2013 10:53
quelle
2

Verwenden Sie functor , Struktur mit operator () oder verwenden Sie einige Bind-Features (std :: bind / boost :: bind).

%Vor%

Und mit Funktor

%Vor%     
ForEveR 04.06.2013 10:40
quelle
2

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%     
Simon Katan 30.07.2013 09:23
quelle

Tags und Links