2010-10-10 11 views
11

mögliche Dubletten Iterieren:
Vector.erase(Iterator) causes bad memory access
iterate vector, remove certain items as I go.Löschen während

Hallo, schrieb ich das, aber ich bin einige Fehler erhalten, wenn es

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { 
     if (track->empty()) { // if track is empty, remove it 
      tracks_.erase(track); 
      track++; // is this ok? 
     }else { //if there are points, deque 
      track->erase(track->begin()); //my program crashes here after a while... ;(
     } 
    } 

I läuft habe einen Vektor von vecto r von Punkten (2 ints), deren I Tracks aufrufen (1 Track ist 1 Vektor von Punkten) Ich möchte jeden Track überprüfen und wenn sie Punkte enthalten, löschen Sie den ersten Track, ansonsten löschen Sie den Track. Ist das richtig?

Vielen Dank im Voraus.

+0

Welche Fehler werden Sie bekommen:

könnte Ihre Schleife wie folgt geschrieben werden? –

+0

Diese Art von Frage wurde schon oft gestellt. Das erste Ergebnis der Suche nach "C++ iterator löschen" ist http://stackoverflow.com/questions/2943912/vector-erasiterator-causes-bad-memory-access, das auch diese Frage beantwortet. – TheUndeadFish

+0

@ nacho4d: Nicht direkt verwandt, aber werfen Sie einen Blick auf Boost MultiArray für zweidimensionale Strukturen. Es ist etwas einfacher zu verwenden als ein 'std :: vector >' type. – lunaryorn

Antwort

33

Ein Vektor erase() macht vorhandene Iteratoren ungültig, aber returns ein neuer Iterator, der auf das Element nach demjenigen verweist, das entfernt wurde. Dieser zurückgegebene Iterator kann verwendet werden, um die Iteration über den Vektor fortzusetzen.

vector< vector<Point> >::iterator track = tracks_.begin(); 
while (track != tracks_.end()) { 
    if (track->empty()) { 
     // if track is empty, remove it 
     track = tracks_.erase(track); 
    } 
    else { 
     //if there are points, deque 
     track->erase(track->begin()); 
     ++track; 
    } 
} 
+0

Ehrfürchtig. Robust, einfach, erfordert keinen eigenen Delegierten usw. – Eliot

+0

Dies ist ein Muster, das häufig genug ist, dass es schön wäre, wenn so etwas in der Standardansicht erscheint. – jbruni

+0

Was macht das 2. "deque" 'löschen'? Der Iterator "Spur" hat nicht einmal eine Erase/Begin-Methode? Kann nicht kompiliert werden und funktioniert ohne. – lama12345

Verwandte Themen