std::list Problem
-
Hi,
ich habe eine std::list und möchte damit folgendes tun:
1. Ich werfe per push_back() einen Eintrag an das Ende der Liste.
2. Per Iterator will ich direkten Zugriff auf diesen Eintrag haben (dazu sind die Iteratoren doch gut, oder?)
3. Diesen Eintrag will ich nach einiger Zeit wieder von der Liste runter nehmen (per iterator)
Das wird einige male wiederholtLeider gab das immer nen Fehler, deswegen hab ich den Code soweit vereinfacht bis ich zu diesen Zeilen gekommen bin, in denen der Fehler ausgelöst wird.
ObjectsList.push_back(this); iterator = ObjectsList.end(); ObjectsList.erase(iterator); ObjectsList.push_back(this); iterator = ObjectsList.end(); ObjectsList.erase(iterator); // <-- Da crasht's
Der Iterator ist übrigens vom Typ "list<Object *>::iterator it", wenn das wichtig sein sollte.
Hat jemand ne Ahnung warum das nicht funktioniert und wie man es richtig macht?
Danke,
GodlikeboT
-
Mich wundert dass es nicht schon vorher crasht, denn list.end() gibt das Element NACH dem letzten Element zurück, folglich gibt es das Element gar nicht und man kann es erst recht nicht löschen!
Bin mir nicht ganz sicher ob das legal ist, aber sonst sollte es klappen:
iterator = --ObjectsList.end();
EDIT: Alternativ einfach einen reverse_iterator benutzen!
-
Ich kenne mich zwar auch nicht besonders gut mit C++ aus, aber anscheinend zeigt der iterator auf das Element, das nach dem letzten (gültigen) Element der Liste kommt, wenn Du ihm ObjectsList.end() zuweist. (hab ich z.B. gerade hier gefunden: http://www.fredosaurus.com/notes-cpp/stl/list-header.html)
Unter dieser Voraussetzung ist es logisch, dass das Programm abstürzt, weil Du versuchst etwas zu löschen, was gar nicht wirklich Teil der Liste ist.
Das ganze wird übrigens durch dieses kleine Beispiel bestätigt:#include <list> #include <iostream> using namespace std; int main() { list<int> intList; list<int>::iterator iter; intList.push_back(19); iter = intList.end(); cout << *iter << endl; //<- gibt Schrott aus return 0; }
Also musst Du den iterator dekrementieren, wenn Du ihm end() zugewiesen hast und das letzte Element löschen willst.
Edit: sry, war zu langsam
-
Super, das funktioniert!
Danke euch beiden!
-
end() würde ich nie verändern.
Ich würde lieber rbegin() nehmen...
-
Shade Of Mine schrieb:
end() würde ich nie verändern.
Ich würde lieber rbegin() nehmen...
Aus welchem Grund?
-
Hallo,
back() sollte eigentlich auch funktionieren.
-
back() liefert keinen iterator
end() würde ich deshalb nicht verändern, weil er ungültig ist.
Ich bin mir nicht sicher ob der standard garantiert, dass man -- darauf anwenden darf, aber ich bekomme dabei bauchweh. Vorallem würde es zB bei einer single linked list garnicht funktionieren.
und rbegin() liefert einen iterator auf das letzte element - also genau das gewollte
-
Hi,
wenn das letzte Element gelöscht werden soll, warum dann dieser ganze Iteratorscheiß?
list::pop_back()
das löscht das letzte Element.
grüße Con@n