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

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

Barbara Streisand
Freigeben: 2024-11-10 14:33:02
Original
1005 Leute haben es durchsucht

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());
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage