JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=cf43b5b6fe789a6e3e44dcf27ac18754Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[STL] Wie durchläuft man am besten eine 'list'?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 30
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.07.2004, 14:50    Titel: [STL] Wie durchläuft man am besten eine 'list'? Antworten mit Zitat

Es gibt dafür 2 einfache Möglichkeiten:
1.
CPP:
list<int> Liste;
list<int>::iterator Iterator;
for(Iterator=Liste.begin(); Iterator!=Liste.end(); Iterator++)
{
//irgendetwas mit der Liste anstellen
}


2.
CPP:
list<int> Liste;
list<int>::iterator Iterator=Liste.begin();
for(int i=0; i<Liste.size(); i++)
{
//irgendetwas machen
Iterator++;
}


Man kann auch bei anderen STL-Objekten mit Iteratoren arbeiten, z. B. bei <map>'s. Einfach mal in der MSDN nachschauen.
_________________
http://www.C3-Soft.de
http://www.nikodemus.net


Zuletzt bearbeitet von Jonathan_Klein am 21.07.2004, 14:35, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 30
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 07.01.2006, 16:25    Titel: Antworten mit Zitat

Möchte man wärend man eine Liste durchläuft gleichzeitig einige Elemente löschen, zum Beispiel Spielobjekte die die Spielfeldrand überschritten haben kann man das folgendermaßen tun:

CPP:
std::list<GameObject> ObjectList;
for(std::list<GameObject>::iterator ObjectIterator=ObjectList.begin(); ObjectIterator!=ObjectList.end(); )
{
 if(ObjectIterator->Ungülitg())//wenn das objekt auf das iterator zeigt ungültig ist, also gelöscht werden soll
 {
   ObjectIterator=ObjectList.erase(ObjectIterator);//Element löschen und Iterator afs nächste zeigen lassen.
 }
 else//damit es nicht zu evtl. speicherüberschreitungen kommen kann
 {
   ++ObjectIterator;
  }
}

_________________
http://www.C3-Soft.de
http://www.nikodemus.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 30
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 11.04.2008, 20:14    Titel: Antworten mit Zitat

Eine sehr viel elegantere und kürzere Methode ist BOOST_FOREACH

http://www.boost.org/doc/libs/1_35_0/doc/html/foreach.html

Auch wenn der Text englisch und das Makro ziemlich komplex ist, so lässt es sich doch kinderleicht benutzen. Der Text enthält ein paar Beispiele, an denen man sieht, wie schön das ganze ist.
ForEach eignet sich aber nur um die Liste genau einmal zu durchlaufen. Für die Löschschleife im oberen Post ist das Makro daher nicht geeignet (da dort ja zur Laufzeit die Liste verändert wird).
_________________
http://www.C3-Soft.de
http://www.nikodemus.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 32
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 04.07.2008, 13:55    Titel: Antworten mit Zitat

Kann die STD auch schon von Haus aus: for_each, remove_if, filter_if, remove_copy_if, etc.. einfach mal in die <algorithm> schauen. :-)

http://msdn.microsoft.com/en-us/library/tca70763%28VS.71%29.aspx

<- Die linke Spalte listet alle Funktionen auf.

Enjoy.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 30
Anmeldedatum: 17.02.2003
Beiträge: 3430
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.07.2008, 17:01    Titel: Antworten mit Zitat

Man sollte evtl. noch erwähnen, das man dafür immer eine Funktion braucht, die dann für jedes Element aufgerufen wird, also ist die eingebaute Lösung zwar recht schön, aber für manche Dinge etwas komplizierter einzusetzen, als das Boost Makro.
_________________
http://www.C3-Soft.de
http://www.nikodemus.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 32
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 09.07.2008, 13:50    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Man sollte evtl. noch erwähnen, das man dafür immer eine Funktion braucht, die dann für jedes Element aufgerufen wird, also ist die eingebaute Lösung zwar recht schön, aber für manche Dinge etwas komplizierter einzusetzen, als das Boost Makro.


Für Funktionen dieser Art sollte man Inline-Funktionen verwenden, also besteht Overrhead-mäßig kein Unterschied zum Makro.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum