Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.09.2008, 19:55

Eintrag in list löschen und wieder ersetzen

Hallo,

ich bin mal wieder an so einer Stelle, da weiß ich net weiter :/
Also, ich habe z.B. in einer list 20 Klassen.
Ein iterator zeigt auf Objekt 8.
Nun möchte ich dieses Objekt löschen , und ein anderes in Stelle acht einsetzen.
So, mein erster Ansatz war mit .erase und .insert zu arbeiten.
Bumm, Fehler.

Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                std::list<CStatic*>::iterator       isChoose;
        isChoose = m_staticList.begin();
        while((*isChoose)->GetChoose() == false)
        {
            isChoose++;   // Element suchen, das ersetze werden soll

        }
        m_staticList.erase(isChoose);
        if ( isChoose == m_staticList.end() )
        {
            m_staticList.push_back(BlaObjekt); // objekt wurde weiter oebn erstellt

        }
        else
        {
            m_staticList.insert(isChoose,BlaObjekt);
        }



Bekomme ein Laufzeitfehler, list iterators incompatibel.
Debugger auch probiert, blicke aber beim besten Wissen net den Fehler o.O

Greetz Unknown

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

24.09.2008, 20:54

C-/C++-Quelltext

1
2
3
4
5
6
7
for(std::list<CStatic*>::iterator it = m_staticList.begin(); it != m_staticList.end(); ++it)
  if(!(*it)->GetChoose())
  {
      m_staticList.insert(it,BlaObjekt);//fügt BlaObjekt vor it ein

      it = m_staticList.erase(it);//erase macht it ungültig, gibt aber gleichzeitig das nächste Objekt zurück

      break;
  }


Anmerkung: es ginge wohl auch in umgekehrter Reihenfolge (erst erase, dann insert). Auch ist das alles aus dem Kopf, also keine Garantien :)

EDIT: Für std::map oder generell kann man statt it = m_staticList.erase(it) auch m_staticList.erase(it++) nutzen. Warum das geht kann man unter dem Thema Post/Preincrement nachlesen ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

25.09.2008, 14:02

Loescht du ein Element aus der Liste, so wird der entsprechende Iterator ungueltig. Das Verhalten eines ungueltigem Iterators ist nicht definiert (undefiniert). Ausserdem sind Listen nicht dafuer ausgelegt, dass die Daten "irgendwie" geordnet sind.

Wahrscheinlich weisst du garnicht wo dein Problem liegt, aber wenn du ganz sicher genau das von dir beschriebene erreichen moechtest, dann musst du dir die Position danach merken. Auch wenn die Position "danach" auf das Ende der Liste verweist, insert funktioniert trotzdem, so dass die entsprechende Abfrage entfallen kann.

Zitat

iterator insert(iterator pos, const T& x) Inserts x before pos.
Quelle: http://www.sgi.com/tech/stl/List.html

4

25.09.2008, 18:22

Danke es klappt :D
einfach einen adneren Iterator auch hochzählen, einmal noch ++ und dann erase - insert, fettig :D
wusste nicht das der Iterator dann ungültig wird

danke =)

Greetz Unknown

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

25.09.2008, 18:48

Hmmm ist mein Betrag eigentlich sichtbar? Weil irgendwie habe ich das Gefühl, dass er mehrfach übersehen wurde :?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

25.09.2008, 21:26

Zitat von »"Nox"«

Hmmm ist mein Betrag eigentlich sichtbar? Weil irgendwie habe ich das Gefühl, dass er mehrfach übersehen wurde :?


Das scheint so eine Angewohnheit einiger User hier zu sein...
@D13_Dreinig

7

26.09.2008, 13:48

@Nox: Nein, du bist nicht unsichtbar, dein Code ist supa. Ich wollte nur darauf hinaus, dass der Iterator ungueltig wird.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

26.09.2008, 15:17

Zitat von »"Nox"«

it = m_staticList.erase(it);//erase macht it ungültig, gibt aber ...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

27.09.2008, 13:57

Re: Eintrag in list löschen und wieder ersetzen

Zitat von »"Unknown"«

Ein iterator zeigt auf Objekt 8.
Nun möchte ich dieses Objekt löschen , und ein anderes in Stelle acht einsetzen.
Wie wäre es, wenn du eine einfache Zuweisung durchführen würdest? :roll:

Werbeanzeige