Heim >Backend-Entwicklung >C++ >Warum hinterlässt erase-remove_if beim Entfernen von Elementen aus einem „std::vector' doppelte Paare?

Warum hinterlässt erase-remove_if beim Entfernen von Elementen aus einem „std::vector' doppelte Paare?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-11 20:30:03363Durchsuche

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

Erase-Remove_if-Idiom zum Entfernen von Paaren

Beim Versuch, das erase-remove_if-Idiom zu verwenden, um Paare aus einem std::vector< std::pair> tritt ein besonderes Problem auf. Obwohl Paare mit einem .first-Wert von 4 gezielt entfernt werden sollen, hinterlässt die erste Implementierung ein doppeltes Paar:

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

Die Wurzel des Problems liegt im unvollständigen Löschvorgang. std::erase_if verschiebt nur passende Elemente an das Ende des Vektors; es entfernt sie nicht. Um die Entfernung abzuschließen, besteht der richtige Ansatz darin, den von std::remove_if zurückgegebenen Iterator als Ausgangspunkt für die Löschung zu verwenden:

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

Den Erase-Remove_if-Mechanismus verstehen:

  • Elementaustausch: std::remove_if tauscht Elemente innerhalb des Vektors aus und verschiebt alle nicht übereinstimmenden Elemente an den Anfang. Übereinstimmende Elemente landen am Ende des Vektors.
  • Prädikatiteration: Der Prädikat-Lambda-Ausdruck bestimmt, welche Elemente entfernt werden sollen. Wenn das Prädikat „true“ zurückgibt, wird das entsprechende Element an das Ende des Vektors verschoben.
  • Iterator-Abruf: std::remove_if gibt einen Iterator zurück, der auf das erste Element zeigt, das mit dem Prädikat übereinstimmt; Dieser Iterator markiert den Anfang der zu entfernenden Elemente.
  • Vektorlöschung: std::vector::erase ruft die Bereichslöschoperation auf, beginnend beim zurückgegebenen Iterator und bis zu den Vektoren Ende. Dieser Schritt entfernt alle übereinstimmenden Elemente aus dem Vektor.

Weitere Einblicke finden Sie im Wikipedia-Artikel zum [Erase-Remove Idiom](https://en.wikipedia.org/ wiki/Erase-remove_idiom).

Das obige ist der detaillierte Inhalt vonWarum hinterlässt erase-remove_if beim Entfernen von Elementen aus einem „std::vector' doppelte Paare?. 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