Element eines vectors löschen
-
Vielen Dank.
So viel zu lernen und nur so wenig Zeit, schade eigentlich.
Gruß Arno
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich häng mich hier mal ran.
Warum geht folgendes vor den Baum:for (MyMap::iterator it = myMap.begin(); it!=myMap.end(); it++) { if (condition xyz...) myMap.erase(it); }Es sieht so aus, als ob der Iteratorwert it bei erase() ungültig wird und deshalb im nächsten Schleifendurchlauf nicht inkrementiert werden kann.
Frage also:
Wie bekomme ich einzelne Elemente in einem Durchgang aus dem Vektor bzw. Map herausgelöscht?Gruß, Thomas
-
Das sieht nicht nur so aus, das ist auch so. Aber normalerweise gibt erase() einen Iterator auf das Element hinter der "Lücke" zurück, den du entgegennehmen und verwenden kannst.
-
Ja, aber auch
for (MyMap::iterator it = myMap.begin(); it!=myMap.end(); it++) { if (condition xyz...) it = myMap.erase(it); }produziert den selben Fehler zur Laufzeit.

-
Thomsn schrieb:
produziert den selben Fehler zur Laufzeit.

Ist vermutlich nicht derselbe - auch wenn er sich genauso äußert

Wenn Du das letzte Element löscht gibt erase Dir den Ende-Iterator zurück. Der wird dann aufgrund der For-Schleife erneut inkrementiert. Egal wo der dann ist, er ist auf keinen Fall mehr == myMap.end(). Dadurch gelangt er ein weiteres mal in den Schleifenkörper und dann knallts gewaltig.
Versuche:
for (MyMap::iterator it = myMap.begin(); it!=myMap.end();) { if (condition xyz...) it = myMap.erase(it); else ++it; }
-
LordJaxom schrieb:
Wenn Du das letzte Element löscht gibt erase Dir den Ende-Iterator zurück. Der wird dann aufgrund der For-Schleife erneut inkrementiert.
Wäre die Rückgabe myMap.end() würde die Schleife doch ganz normal abbrechen.
-
Theoretisch ja - aber der Iterator wird am Schleifenende nochmal erhöht, BEVOR die Abbruchbedingung überprüft wird. Und was herauskommt, wenn du den end()-Iterator erhöhst, ist undefiniert (und häufig unangenehm).
-
Klar, jetzt verstehe ich. Nach dem selben Prinzip läuft auch
for (int i=0; i!=3; i++) { i = 3; }ins Endlose.
Danke euch!
-
Das hier geht auch
for (MyMap::iterator it = myMap.begin(); it!=myMap.end();) { if (condition xyz...) myMap.erase(it++); else ++it; }