1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • 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
  • bimbo
    15
    bimbo
    Mitglied
    Reaktionen
    15
    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.

    LVA Erfahrungsberichte: http://vowi.fsinf.at/

  • Lord Binary
    18
    Lord Binary
    Mitglied
    Reaktionen
    11
    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


    Trading for a living [equities,futures,forex]

  • bimbo
    15
    bimbo
    Mitglied
    Reaktionen
    15
    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

    LVA Erfahrungsberichte: http://vowi.fsinf.at/

  • jjan
    6
    jjan
    Mitglied
    Reaktionen
    8
    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.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

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

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

    LVA Erfahrungsberichte: http://vowi.fsinf.at/

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung