std::list: Bleibt end gültig ?
-
Also, folgender Sachverhalt:
std::list<int> ilist; std::list<int>::iterator iend = ilist.end(); ilist.push_back(3); // Ist end hier noch gültig ? bzw. liefert std::list::end immer den selben wert ?Ich vermute das es so ist, bin mir aber net sicher, also ist es so oder net ?
mfg.
phlox
-
Ich kann zwar jetzt nicht die richtige Stelle im Standard zitieren, abar afaik bleiben list<> Iteratoren immer gültig (außer wenn du sie selber löschst).
-
definiere gültig. Der Iterator end() sollte nie dereferenziert werden, da er auf die Stelle nach dem letzten Element der Liste zeigt. Allerdings sollte end() - 1 demzufolge auf das letzte Element zeigen. Kannst ja mal folgendes versuchen:
list<int> testlist; testlist.push_back(0); list<int>::iterator ite = testlist.end(); list<int>::iterator it0 = ite - 1; //sollte jetzt auf das Element mit der 0 zeigen testlist.push_back(1); list<int>::iterator it1 = ite - 1; cout << "it0: " << *it0 << ";\n" << "it1: " << *it1 << ";\n";Wenn ite auch nach dem Einfügen der 1 noch hinter das Ende der Liste zeigt, sollte die Ausgabe "0; 1;" lauten. Zeigt ite einfach hinter die 0, könnte die Ausgabe "0; 0;" sein...
-
pumuckl schrieb:
definiere gültig. Der Iterator end() sollte nie dereferenziert werden, da er auf die Stelle nach dem letzten Element der Liste zeigt. Allerdings sollte end() - 1 demzufolge auf das letzte Element zeigen. Kannst ja mal folgendes versuchen:
list<int> testlist; testlist.push_back(0); list<int>::iterator ite = testlist.end(); list<int>::iterator it0 = ite - 1; //sollte jetzt auf das Element mit der 0 zeigen testlist.push_back(1); list<int>::iterator it1 = ite - 1; cout << "it0: " << *it0 << ";\n" << "it1: " << *it1 << ";\n";Wenn ite auch nach dem Einfügen der 1 noch hinter das Ende der Liste zeigt, sollte die Ausgabe "0; 1;" lauten. Zeigt ite einfach hinter die 0, könnte die Ausgabe "0; 0;" sein...
Das ist mir schon klar, ich hab ach nicht vor, das zu tun.
Ich will halt nur wissen, ob das Ende der Liste immer das Ende der Liste bleibt.
Oder ob sich da was verändert. und statt end()-- nehm ich rbegin()
phlox
-
In 23.2.2.3 steht, dass insert, push_front und push_back (für Listen!) niemals Iteratoren und Referenzen invalidieren. erase, pop_front, pop_back und clear invalidieren nur Iteratoren und Referenzen auf gelöschte Elemente. Was heißen sollte, dass end selbst nach einem clear gültig bleibt.
-
Probiers einfach aus. Wenn die Liste allerdings so funktioniert wie ich es mir vorstelle ist, dann ist end dannach nicht mehr gültig. Aber da nicht zählt was ich mir vorstelle, sondern das was man programmiert hat, würde ich sagen probier es einfach aus. Füge aber mal ein paar mehr Elemente an die Liste an (z.B. 50) wenn end dann immer noch am Ende der Liste ist stimmt es. (Kannst dann ja noch testen was passiert wenn du erase & Co aufrufst)
-
flammenvogel schrieb:
Probiers einfach aus. Wenn die Liste allerdings so funktioniert wie ich es mir vorstelle ist, dann ist end dannach nicht mehr gültig. Aber da nicht zählt was ich mir vorstelle, sondern das was man programmiert hat, würde ich sagen probier es einfach aus. Füge aber mal ein paar mehr Elemente an die Liste an (z.B. 50) wenn end dann immer noch am Ende der Liste ist stimmt es. (Kannst dann ja noch testen was passiert wenn du erase & Co aufrufst)
Dann hast du scheinbar eine falsche Vorstellung davon wie man eine Liste ungefähr implementiert. Außerdem, hast du 7H3 N4C3Rs Post nicht gesehen?
-
Das ist schon möglich, ich habs einmal versucht, nachdem ich ein Tutorial über Container Klassen gelesen habe. (Da stand ungefähr drin wie es geht)...
Und nein ich habe den Post nicht gelesen. Als ich geantwortet habe war die irgendwie gerade nicht da.

-
Ausprobieren ist im Fall der Standardbibliothek keine erlaubte Technik. Das kann mit der einen Implementierung funktionieren, mit der anderen nicht.
Auch ist list::iterator::operator- nicht definiert. Daher ist folgendes nicht erlaubt:
list<int>::iterator ite = testlist.end(); list<int>::iterator it0 = ite - 1;list::iterator ist ein bidirectional Iterator aber kein random access Iterator.
-
tntnet schrieb:
Ausprobieren ist im Fall der Standardbibliothek keine erlaubte Technik. Das kann mit der einen Implementierung funktionieren, mit der anderen nicht.
Stimmt, erlaubt ist nur ein Blick in die Definition - und dort steht drin, daß list<> nur die Iteratoren ungültig macht, die direkt gelöscht wurden.
Auch ist list::iterator::operator- nicht definiert. Daher ist folgendes nicht erlaubt:
list<int>::iterator ite = testlist.end(); list<int>::iterator it0 = ite - 1;Zur Not kann man ja advance() stattdessen nehmen - und das ist für jeden Iterator definiert.