std::list Objekt aus der Mitte löschen
-
Hallo,
ich habe eine Liste mit Objekten von Flugzeugdaten, jetzt möchte ich ein beliebiges Objekt löschen, also irgendwo von der Mitte, nicht am Anfang, oder Ende.
Dachte das müsste mit erase gehen, aber igendwie bekomme ich es nicht hin
Folgender Code
void einFlugzeugLoeschen(FlugzeugListe& alleFlugzeuge) { if(!alleFlugzeuge.empty()) { bool found = false; string flugnummer; string tempflugnummer; cout << "Bitte Flugnummer des Flugzeuges eingeben, dass landen soll:"; cin>> flugnummer; FlugzeugListe::iterator iter = alleFlugzeuge.begin(); for(iter; iter != alleFlugzeuge.end(); ++iter) { if(flugnummer == iter->getFlightNumber()) { alleFlugzeuge.erase(Flugzeuge(iter->getFlightNumber(),iter->getStartAirport(), iter->getLandingHour(),iter->getLandingMinutes())); // geht leider nicht.. found = true; }//end if }//end for if(found == false) { cout << "\n#### Flugnummer wurde nicht gefunden #####" << endl; }// end if }// end if else cout << "\n#### Flugliste ist Leer #### "<< endl; }Wäre fur jeden sinnvollen Vorschlag dankbar.
Gruss
Joe
-
du musst erase() einen iterator übergeben. Dieser ist nebenbeibemerkt danach ungültig
while(iter != alleFlugzeuge.end()) { if(flugnummer == iter->getFlightNumber()) { alleFlugzeuge.erase(iter++); //Postinkrement, da iter sonst ungültig wird found = true; } else { iter++;//Wenn der aktuelle Datensatz nicht der gesuchte ist müssen wir den iterator trotzdem weiterbewegen } }
-
WOW, genial!
vielen Dank!
Gruss
Joe
-
und jetzt das ganze nochmal mit boost::lambda
Flugzeugliste::iterator end = remove_if( alleFlugzeuge.begin(), alleFlugzeuge.end(), bind(Flugzeug::getFlightNumber, _1) == flugnummer)); alleFlugzeuge.erase( end, alleFlugzeuge.end());*denkfehler gefixt #2*
-
@Topic:
Sicherer dürfte sein, den Iterator den erase zurückgibt zu verwenden:iter=alleFlugzeuge.erase(iter);@r0nny:
Da fehlt aber noch das alleFlugzeuge.erase( ergebnis_von_remove_if, alleFlugzeuge.end() )
-
@LordJaxom
http://cppreference.com/cppalgorithm/remove_if.html ist da leicht verwirrendich bin davon ausgegangen, das die elemente tatsächlich entfernt werden
-
LordJaxom schrieb:
@Topic:
Sicherer dürfte sein, den Iterator den erase zurückgibt zu verwenden:iter=alleFlugzeuge.erase(iter);Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...
-
KasF schrieb:
Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...
Der Auszug war auch für die direkte Verwendung im if-Zweig der Bedingung im Codebeispiel von r0nny gedacht

-
LordJaxom schrieb:
KasF schrieb:
Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...
Der Auszug war auch für die direkte Verwendung im if-Zweig der Bedingung im Codebeispiel von r0nny gedacht

Achso sry, meinst aber bestimmt von darthdespotism

-
Äh, ja. Ronny hat mich grad auch drauf hingewiesen.
(Warum gibt's hier keinen Hinter-Mauer-Versteck-Smiley?)
-
Ähh ronny, das stimmt immer noch nicht so
