Ich versuche, die Tatsache zu nutzen, dass Iteratoren für Listen nach dem Einfügen und Entfernen (außer Iteratoren zu dem, was Sie gerade entfernt haben) gültig bleiben. Gilt das auch für std::list<T>::end();
Angenommen, ich versuche Folgendes:
%Vor% Dies ist wichtig, da ich sonst eine Sammlung von Iteratoren in dieser Liste speichern könnte, und ich würde die Gültigkeit durch Vergleich mit myList.end()
testen. Es ist wichtig, dass ungültige Iteratoren auch nach dem Einfügen und Entfernen bleiben.
Der Wert von std::list
s Ende-Iterator ändert sich niemals während der Lebensdauer der Liste. Es ist immer gültig, immer gleich und entspricht immer dem imaginären Element "nach dem Ende" der Liste. Dies bedeutet, dass der Wert von some_list.end()
, der an einem beliebigen Punkt in der Lebensdauer der Liste gespeichert wird, immer gleich dem Wert von some_list.end()
an einem anderen Punkt seiner Lebensdauer ist.
Die Sprachspezifikation gibt dies nicht explizit an. Es gibt jedoch einfach keine gültige Operation in der Liste, die den Enditerator ungültig machen oder seinen Wert mit einem anderen Ort verknüpfen würde.
In Ihrem Beispiel wird der zweite Zweig dieses if
niemals ausgeführt.
Wenn ich nichts verpasse, gilt dies auch für std::map
und std::set
.
Haben Sie einen einfachen Test versucht, indem Sie eine cout
in jede Klausel der IF-Anweisung einfügen? Wenn Sie dies tun, werden Sie feststellen, dass die erste -Klausel ( iter == myList.end()
) tatsächlich wahr ist.
Ich werde meine Argumentation einfach auf diese Dokumentation der end () -Funktion stützen: Ссылка . Es heißt: "Gibt einen Iterator zurück, der sich auf das Element über das Ende im Listencontainer bezieht." Wenn also der Iterator, der auf am Ende zeigt, zurückgegeben wird, sollte er nicht immer über das Ende zeigen? Elemente, die vor diesem Punkt eingefügt wurden, sollten nicht beeinflussen, wohin der Iterator zeigt (das ist ein Punkt nach dem letzten Element der Liste).