Heim >Backend-Entwicklung >C++ >Warum hinterlässt mein Erase-Remove_If-Code Duplikate?

Warum hinterlässt mein Erase-Remove_If-Code Duplikate?

Barbara Streisand
Barbara StreisandOriginal
2024-11-10 14:33:021050Durchsuche

Why Is My Erase-Remove_If Code Leaving Duplicates?

Erase-Remove_If Idiom: Korrekte Anwendung

Das erase-remove_if Idiom ist eine vielseitige Technik zum effizienten Entfernen von Elementen aus einem Container basierend auf a Prädikat. Eine unsachgemäße Implementierung kann jedoch zu unerwarteten Ergebnissen führen.

Im gegebenen Beispiel wollten Sie Paare mit dem .first-Wert 4 aus einem Vektor von Paaren mit erase-remove_if entfernen. Ihr Code hinterlässt jedoch Duplikate, was auf einen Fehler hinweist.

Der korrekte Code sollte wie folgt lauten:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

Die Erklärung liegt im Mechanismus von erase-remove_if.

So funktioniert es

std::remove_if tauscht Elemente innerhalb des Vektors aus, um Elemente zu gruppieren, die nicht mit dem Prädikat am Anfang übereinstimmen. Anschließend gibt es einen Iterator an das erste zu entfernende Element zurück und markiert so die Trennung zwischen den Elementen, die beibehalten und entfernt werden sollen.

std::vector::erase beginnt am zurückgegebenen Iterator und löscht alle nachfolgenden Elemente, wodurch effektiv entfernt wird alle Elemente, die mit dem Prädikat übereinstimmen.

In Ihrem ursprünglichen Code haben Sie den zweiten Parameter für std::erase weggelassen, was dazu führte, dass nur das vom zurückgegebenen Iterator angegebene Element entfernt wurde. Dies führte zu Duplikaten, da nachfolgende Elemente, die mit dem Prädikat übereinstimmten, nicht gelöscht wurden.

Durch die Einbeziehung des zweiten Parameters stopPoints.end() weisen wir erase an, den Bereich vom zurückgegebenen Iterator bis zum Ende des zu entfernen Vektor, um sicherzustellen, dass alle übereinstimmenden Elemente entfernt werden.

Ausführlichere Informationen zum Erase-Remove-Idiom finden Sie im Wikipedia-Eintrag: https://en.wikipedia.org/wiki/Erase–remove_idiom

Das obige ist der detaillierte Inhalt vonWarum hinterlässt mein Erase-Remove_If-Code Duplikate?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn