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

11

27.10.2010, 14:13

Hi,

ich hatte vor kurzer Zeit ein ähnliches Problem. Ich wollte aus einem vector bestimmte Elemente löschen. Das funktionierte auch nicht, weil der Iterator ja ungültig wird.

Dazu habe ich remove_if gefunden. In Verbindung mit einem Lambda funktioniert das super, wenn diese Funktion nach der Schleife ausgeführt wird, die bestimmt, welche Elemente gelöscht werden können und diese markiert.

C-/C++-Quelltext

1
std::remove_if(liste.begin(),liste.end(),[](Typ t){return t.loeschen;});

Damit wird nicht direkt gelöscht. Sondern es werden nur alle Elemente so sortiert, dass am Anfang der Liste diejenigen stehen bleiben, die gültig sind und am Ende, diejenigen Elemente, die gelöscht werden können. Der Rückgabewert ist ein Iterator auf das erste ungültige Element. Also kann danach von diesem Iterator bis liste.end() alles gelöscht werden.

C-/C++-Quelltext

1
std::erase(std::remove_if(liste.begin(),liste.end(),[](Typ t){return t.loeschen;}),liste,end());


Hier gibt es eine gute Beschreibung mit Beispiel.

Vielleicht hilft dir das ja weiter.

Gruß

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

12

27.10.2010, 14:47

Ihr wisst aber schon, dass erase() einen Iterator zurückliefert, der auf das nächste gültige Element zeigt? :-)

Quellcode

1
2
3
4
5
6
7
for( auto it = container.begin(); it != container.end(); /*leer*/ )
{
  if( sollGeloeschtWerden( it) )
    it = container.erase( it);
  else
    ++it;
}


Damit hab ich das immer gemacht.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

13

27.10.2010, 16:37

Hehe, vier für no_one völlig unhilfreiche Beiträge hintereinander (diesen mitgerechnet)
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

14

27.10.2010, 16:58

Ihr wisst aber schon, dass erase() einen Iterator zurückliefert, der auf das nächste gültige Element zeigt? :-)

Quellcode

1
2
3
4
5
6
7
for( auto it = container.begin(); it != container.end(); /*leer*/ )
{
  if( sollGeloeschtWerden( it) )
    it = container.erase( it);
  else
    ++it;
}


Damit hab ich das immer gemacht.
Das gilt nur unter Windows und ist eine spezifische Erweiterung !

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

15

27.10.2010, 17:34

Hehe, vier für no_one völlig unhilfreiche Beiträge hintereinander (diesen mitgerechnet)

ja, in der tat :D
vor allem war das problem ja eigentlich bereits gelöst ^^

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

16

28.10.2010, 10:12

Das gilt nur unter Windows und ist eine spezifische Erweiterung !


Oha, Du hast Recht. Hab grade nochmal in der C++-Referenz geschaut, die diese Option gar nicht auflistet. Danke für den Hinweis!
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

17

28.10.2010, 16:39

Das gilt nur unter Windows und ist eine spezifische Erweiterung !


Oha, Du hast Recht. Hab grade nochmal in der C++-Referenz geschaut, die diese Option gar nicht auflistet. Danke für den Hinweis!
Das sind die fiesen Tücken, die Platformunabhängigkeit erschweren. Microsoft sei Dank.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

18

29.10.2010, 21:46

Naja manchmal ist es ganz gut einfach mal alternative Lösungen anzubieten. Vorallem ist das mit dem erase durchaus ein Thema wo man öfters mal drauf stößt.
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.

Werbeanzeige