Iterator-Frage
-
Hi,
sorry, ich muss euch nochmal mit einer Frage nerven
Wenn ich so eine Schleife habe:
for (std::list<Player*>::iterator i = m_clients.begin(); i != m_clients.end(); ++i) { // ... m_clients.erase(i); // ... }
Was muss ich danach mit i machen, damit es wieder stimmt, d.h. die Schleife mit dem nächsten Element weiterläuft? Ich hab es schon mit --i, nicht verändern und ++i versucht, aber irgendwie hat keins so richtig funktioniert, z.B. auch in meinem aktuellen Fall, in dem die Liste nur einen Datenknoten hat und der dann gelöscht wird, kriege ich für den nächsten Schleifendurchlauf eine Access Violation.
ChrisM
-
du löschsts alles und wunderst dich das es probleme beim zugriff auf nicht existente elimente gibt ?
-
Hi,
nein, ich dachte, i ist dann end() und die Schleife wird abgebrochen.
ChrisM
-
erase macht den Iterator ungültig, gibt dafür aber das nächste Element zurück.
i = erase(i);
(Bin mir nicht ganz sicher ob's das nächste oder vorige Element ist.. sgi.com schweigt sich darüber aus und bin grad zu faul in's Buch zu gucken)
-
std::list<Player*>::iterator i = m_clients.begin(); while (i != m_clients.end()) { // ... erase gibt einen Iterator auf das nachfolgende Element zurück i = m_clients.erase(i); }
-
btw wenn du die elemente einer liste löschen willst mach clear ... das löscht den gesammten inhalt.
-
Hi,
danke Greenthumb, es geht!
erase() gibt laut MSDN nämlich den Zeiger nach dem gelöschten Element zurück...
ChrisM
-
1ntrud0r schrieb:
btw wenn du die elemente einer liste löschen willst mach clear ... das löscht den gesammten inhalt.
Will ich ja nicht, nur das eine Element. Und ich wollte keine Sonderlösung für Element ist vorne, Element ist hinten, Element ist einziges Element usw. implementieren
Aber wie gesagt, jetzt geht's!
ChrisM
-
das code bsp von bashar löscht aber die gesammte liste ?
-
Der Code im Ursprungsposting auch. Na und? Das erase in ein if zu verpacken ist eigentlich kein Akt.
-
Hi,
jo, das kann ich grad noch so selbst.
ChrisM