Element eines vectors löschen
-
Hab den Fehler gefunden.
Und zwar rufe ich .erase(pos) in der while-Schleife auf. Die Bedingung lautet "i < Flugzeug.size()", was natürlich nicht funktionieren kann, weil sich die grösse und die Anordnung der Elemente im Vektor ändert.
Sorry hab meine Ausgabe nicht genau angeschaut, sonst wäre mir das schon früher aufgefallen.
-
Jetzt hab ich natürlich das nächste Problem.
Ist es möglich mittels eines Iterators und meinen Elementfunktionen auf den Vektor zuzugreifen? Wenn ja, wie?
-
Hallo
natürlich geht das.
vector<MyClass>::iterator it = ...; it->MyMethode();bis bald
akari
-
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; }