1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

stl::list probleme beim löschen

    • Frage
  • bimbo
  • 31. März 2004 um 20:24
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • bimbo
    Punkte
    2.320
    Beiträge
    390
    • 31. März 2004 um 20:24
    • #1

    ich würd gern alle elemente einer stl:list durchlaufen, und die objekte, deren lebenszeit abgelaufen ist rauslöschen.

    Code
    for (HudElements::iterator it = ml_Elements.begin(); it != ml_Elements.end(); it++)
    	{
              if  (*it)->dead)
                { ml_Elements.erase(it);
    }

    - funktioniert aber nicht.

  • Lord Binary
    Punkte
    3.301
    Beiträge
    647
    • 31. März 2004 um 20:46
    • #2

    So ein Konstrukt -
    linear(!!) Durchiterieren und dabei Löschen,
    ist IMMER problematisch, verursacht oft bösartigste Bugs.
    Der Iterator wird durchs Löschen (möglicherweise) invalidiert (oder "hüpft" umher), kann/wird Probleme mit der Schleife geben.

    Es bietet sich z.B
    list::remove (const T& value) an.

    Löscht alle Elemente der Liste mit Wert=value.
    Es wird der == Operator vom Typ der Listenelemente genommen.

    Oder mit erase sollte es eigentlich so gehen:
    (ohne Gewähr, nicht ausprobiert)

    Code
    itr=list.begin();
    while(itr != list.end())
    {
    if (löschen) itr = liste.erase(itr);
    else ++itr;
    }



    Aber trotzdem sollte man sowas eher vermeiden, das Iterator-Invalidierungsverhalten beim Löschen ist von Container zu Container recht verschieden und das kann ziemlich subtile Probleme geben.

    Mfg, LB

  • bimbo
    Punkte
    2.320
    Beiträge
    390
    • 1. April 2004 um 18:10
    • #3

    das das nicht das beste ist hab ich auch schon gecheckt, aber wie kann ich das umgehen?

    ich hab da eine liste von elementen die am bildschirm angezeigt werden soll, nach einer bestimmten zeit(die nat. in den elementen gespeichert ist) sollen die elemente aber wieder aus der liste gelöscht werden( nicht mehr gezeichnet). wie soll ich das sonst realisieren ausser mit einerliste wo ich die elemente drinnen hab, die dann linear(!!) durchgeh und dann ein element lösche, wenn seine zeit gekommnen ist?
    ich könnte eine liste mit den elementen erstellen, die ich löschen will, und die dann von der bestehenden liste abziehen, aber da ist dann wieder eine 2te liste im spiel.

    lg, bimbo

  • jjan
    Punkte
    293
    Beiträge
    57
    • 1. April 2004 um 18:38
    • #4

    Verwende std::remove_if. Das "verschiebt" die zum Tode verdammten Elemente ans Ende der Liste und liefert dir einen Iterator aufs Ende der Liste aus gewünschten Elementen.

    Danach kannst du mit erase() die unerwünschten Elemente am Ende der Liste löschen.

  • bimbo
    Punkte
    2.320
    Beiträge
    390
    • 1. April 2004 um 19:11
    • #5

    danke für den tip, werd ich glcih mal testen

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum