Bearbeiten: Die Dokumentation für std::remove
wurde behoben, seit diese Antwort geschrieben wurde. Gleiches gilt für list::remove
.
Lassen Sie mich Ihnen ein Beispiel geben, um Ihnen zu zeigen, wie cpluscplus.com etwas falsch machen kann.
Betrachten Sie die std::remove
Funktion von <algorithm>
.
Tatsache ist, dass std::remove
der Artikel nicht aus dem Container entfernt wird. Sein , weil std::remove
Arbeiten mit einem Paar von Iteratoren nur und nichts über die Container wissen , welche die Elemente tatsächlich enthalten. Tatsächlich ist es nicht möglich std::remove
, den zugrunde liegenden Container zu kennen, da es unmöglich ist, von zwei Iteratoren aus herauszufinden, zu welchem Container die Iteratoren gehören. So std::remove
entfernen Sie nicht wirklich die Einzelteile, einfach weil es nicht kann . Die einzige Möglichkeit , ein Element tatsächlich aus einem Container zu entfernen, besteht darin, eine Elementfunktion für diesen Container aufzurufen.
Wenn Sie also die Elemente entfernen möchten, verwenden Sie Erase-Remove Idiom :
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
Aber cplusplus.com
gibt falsche Informationen über std::remove
. Es sagt
Beachten Sie, dass diese Funktion die Elemente nach dem neuen Ende nicht ändert , die ihre alten Werte beibehalten und weiterhin zugänglich sind .
das ist nicht richtig. Der Iterator im Bereich [new_end, old_end)
ist immer noch dereferenzierbar, aber das bedeutet NICHT, dass sie die alten Werte beibehalten und weiterhin zugänglich sind. Sie sind nicht spezifiziert.
In ähnlicher Weise cplusplus.com
gibt es auch falsche Informationen über list::remove
. Es heißt :
Beachten Sie, dass eine globale Algorithmusfunktion, remove, mit einem ähnlichen Verhalten vorhanden ist, jedoch zwischen zwei Iteratoren arbeitet.
das ist völlig falsch. Das globale Entfernen ist nämlich std::remove
nicht ähnlich list::remove
, da wir gesehen haben, dass das erstere die Elemente NICHT wirklich aus dem Container entfernt, weil es nicht kann , während das letztere (die Mitgliedsfunktion) die Elemente wirklich entfernt , weil es kann .
Diese Antwort wurde mit wenigen Änderungen aus meiner anderen Antwort im folgenden Thema kopiert:
Hinweis: Da ich kürzlich darauf gestoßen bin, als ich auf das obige Thema geantwortet habe, erinnere ich mich daran. Es gibt viele Fehler, auf die ich in den letzten zwei Jahren gestoßen bin, an die ich mich nicht erinnere. Ich könnte später noch ein paar hinzufügen, wenn ich wieder rüberkomme.