Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.09.2005, 19:45 Titel: Stl List durchlaufen und gleichzeitig Elemente rauslöschen |
|
|
Ok, ich laufe eine stl::list mit Iteratoren durch und möchte bestimmt Objekte rauslöschen. Nur wenn ich ein Objekt rauslösche, dann wird der Iterator ja ungültig und ich müsste wieder von vorne anfangen.
Also, hab ich erst einen Temp Iterator erstelt, den mit dem richtigen gleichgesetzt, den richtigen eins weiter gesetzt und das Temp Element gelöscht. Das ging leider auch nicht. Also was nun? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 14.09.2005, 20:02 Titel: |
|
|
Sollte die Löschen-Funktion nicht einen Iterator zurückgeben? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.09.2005, 20:07 Titel: |
|
|
mal kurz testen...
sollte das deleten dann einen Iterator zurückbgeben der auf das nächste element zeigt, so das ich einfahc weiter machen kann? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.09.2005, 20:14 Titel: |
|
|
ok, es schient nicht zu funktinoieren:
CPP: | Iterator=m_RenderList.erase(Iterator);
|
_________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.09.2005, 07:22 Titel: |
|
|
Die erase()-Funktion sollte einen Iterator auf das nächste Element nach dem gelöschten liefern. Wenn keins mehr da ist, ist das list.end().
Christian |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 15.09.2005, 08:18 Titel: |
|
|
Patrick hat Folgendes geschrieben: | liegt daran das eine std::list dafür nicht konzipiert ist sondern std::vector, hab ich doch schon im letzten thread gesagt. |
also das verstehe ich jetzt nicht.
Wieso ist std::list nicht dafür konzepiert? man sollte doch rein technisch ohne probleme elemente aus einer std::list löschen können, und trotzdem weiter iterieren können. Ein std::vector müsste dazu komplett neu aufgebaut werden. |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 15.09.2005, 08:48 Titel: |
|
|
xardias
Verkettete Liste bedeutet das nur das 1. und das letzte Element löschen kann, zugriff jedoch auf alle möglich ist - Informatikdefinition
Doppelt Verkettete Liste (vector) schreibt vor das vollster Zugriff auf alle Elemente möglich ist sowie löschen einer beliebigen position - Informatikdefinition
std::list wurde für dieses Vorhaben nicht konzipiert, klar geht es mit einem iterator-hack (hier muss man wirklich schon von hack sprechen) aber es geht ums Prinzip.
Nimm std::vector oder std::map _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 15.09.2005, 09:06 Titel: |
|
|
std::list ist doppelt verkettet. std::vector ist nichts anderes als linear hintereinander liegender Speicher. |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 15.09.2005, 09:07 Titel: |
|
|
also wenn ich den stroustrup richtig verstehe, dann ist vector doch keine liste, oder?
ich dachte immer vector sei über ein simples array implementiert.
und liste ist, wenn ich den stroustrup richtig verstehe auf das löschen und einfügen von elementen optimiert. |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 15.09.2005, 11:42 Titel: |
|
|
Zitat: |
Wieso ist std::list nicht dafür konzepiert? man sollte doch rein technisch ohne probleme elemente aus einer std::list löschen können, und trotzdem weiter iterieren können.
|
Das Problem ist dann wahrscheinlich nur, dass weil ja der iterator bereits erhört wurde dann nochmal in der Schleife inkrementiert wird.
Man könnte z.B. auch ne clearliste anlegen, dauert aber halt dann auch länger, so hab ich das immer bei meinem Pacman gemacht. _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 15.09.2005, 13:15 Titel: |
|
|
Christian Rousselle hat Folgendes geschrieben: | std::list ist doppelt verkettet. std::vector ist nichts anderes als linear hintereinander liegender Speicher. |
richtig
Patrick, es ist eher anders rum. Wenn man bei einen Vector ein Element löscht, dann wird das komplette Feld nochmal neu mit allen Werten angelegt und das alte gelöscht _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
proggaholic Junior JLI'ler
Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 18.09.2005, 17:44 Titel: |
|
|
Zitat: | list
Sequentielle Datenstruktur, die für schnelles Einfügen und Löschen an beliebigen Positionen optimiert ist, im Zugriff aber langsamer als vector...ist (doppelt verkettete Liste).
vector
Lineare Datenstruktur, die für Einfügen und Löschen am Ende der Datenstruktur sowie schnellen Zugriff auf beliebige Positionen optimiert ist (dynamisches Array).
Verwenden Sie vector, wenn Sie Elemente vorzugsweise am Ende einfügen oder löschen und ansonsten den indizierten Zugriff mit [] oder at() (at() prüft auf gültigen Index) nutzen wollen.
|
Dirk Louis im "C/C++ Kompendium", S. 1207/1208 |
|
Nach oben |
|
|
|