Verstehe <list> und iterator nicht
-
Hallo,
ich habe folgendes Problem zu lösen: Ich möchte einen Graph mit Hilfe eines Stacks traversieren und die Ergebnisse in einer Liste speichern, allerdings sollen die Verästelungen auch an der Stelle in die Liste geschrieben werden, an der sie auftreten (also bis zum ersten Knoten nur push_back - danach steht im Stack ein Zeiger, der mir sagt, wo ich jetzt einfügen soll...)
Aber ich hänge schon beim Verständnis der Iteratoren des <list> Datentyps - anscheinend soetwas wie ein Zeiger, aber das man einen Zeiger des list-Element-Typs nicht in einen Iterator casten kann, macht mich schon stutzig...

However, hier ein kleines Codeschnipsel, das zeigen sollte wo das Problem liegt (ja ich habe den MSDN Eintrag von <list> gelesen - daraus habe ich auch den Code zum Ausgeben der Liste, was passiert da eigentlich bei dem "++it"? Der Debugger zeigt den Wert von it dummerweise nicht an.)
list<int> a; list<int>::iterator it; a.push_back(1); it = a.end(); //it sollte jezt direkt hinter 1 zeigen a.push_back(3); a.push_back(4); a.insert(it, 2); //sollte hinter 1 einfügen //Aber das gibt jetzt "1 3 4 2" aus for (it = a.begin(); it != a.end(); ++it) cout << *it << " ";Was also passiert ist, dass ich weiterhin auf das Ende der Liste zeige - verstehe ich aber von daher nicht, dass ich hinten ja jetzt etwas angefügt habe und die Liste erweitert...
Wäre nett, wenn ihr mir helfen könntet - eigentlich müsste eine verkettete Liste ja dafür da sein, genau solche Probleme zu lösen. Ein Iterator auf 1 (also auf das letzte Element) hätte mir schon weitergeholfen aber z. B.
it = &a.back();geht ja auch nicht... (begin nützt auch nichts, da wo jetzt eine 1 in der Liste steht, bin ich ja sonst schon irgendwo in der Mitte!)
Vielen Dank,
Patrick
-
hm... genau versteh ich dein problem nicht so richtig

aber: Ein iterator ist sozusagen der Zeiger auf ein Listenelement. Mit (*it) kommst du an den Inhalt dieses Listenelementes. It ist sozusagen das, sorauf du in diesem Moment zugreifen kannst. Mit it++ oder ++it kannst du dich durch die Liste nach vorne hangeln, indem du eben das Sichtfenster auf den Nachfolger schiebst. Mit it-- gehts genauso, nur eben rückwaärts.
Ich hoffe, das war erstmal versätndlich
-
Hm okay, danke habe daraufhin jetzt etwas herumprobiert und herausgefunden, dass
it = a.end(); it--; a.push_back(3); a.push_back(4); it++; a.insert(it, 2);das erwünschte Verhalten zeigt. Habe mir den Iterator irgendwie als festen Zeiger vorgestellt, aber wenn ich auf end zeige, bin ich wohl auch immer am Ende der Liste, auch wenn ich sie danach erweitere...
Werde jetzt mal versuchen, das in meinem Algorithmus umzusetzen.
Patrick
-
okay hat sich jetzt erledigt, läuft mittlerweile und ich glaub ich habs verstanden wie das mit dem iterator läuft - hatte noch einige andere Fehler im Code, weswegen das ganze nicht gelaufen ist.
-
du schreibst zwar, daß du das problem bereits verstanden hast, aber vielleicht ist es ja trotzdem hilfreich.
end() zeigt ja hinter das letzte element, dh auf gar keins! der end()-iterator ist normalerweise als eine konstante implementiert, die intern als listenende aufgefaßt wird. deshalb wird, selbst wenn du an die liste dann nochwas anhängst, der end()-iterator immer noch als listenende aufgefaßt!