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!