Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 36 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.07.2004, 15:50 Titel: [STL] Wie durchläuft man am besten eine 'list'? |
|
|
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. _________________ https://jonathank.de/games/
Zuletzt bearbeitet von Jonathan_Klein am 21.07.2004, 15:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 36 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 07.01.2006, 17:25 Titel: |
|
|
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;
}
}
|
_________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 36 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.04.2008, 21:14 Titel: |
|
|
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). _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 36 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.07.2008, 18:01 Titel: |
|
|
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. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 09.07.2008, 14:50 Titel: |
|
|
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 |
|
|
|