in list auf Element zugreifen
-
Hallo!
Ich würde gerne folgende Bibliothek verwenden: http://www.cplusplus.com/reference/stl/list/
Ich möchte in der Liste Kinderknoten von einem Knoten in einem Baum speichern.
Dabei möchte ich ja auch auf ein bestimmtes Kind zugreifen können.Ich habe mir eine Klasse Node gebaut und möchte nun folgendes schreiben:
Node* Node::getChild(Node node,unsigned int elementnumber){ ... }
Wie greife ich also auf das nte Element so einer Liste zu?
Wie genau funktioniert das also mit diesem Iterator?Danke vielmals,
Wumme
-
Hmm, eventuell ist da eine std::list der falsche ansatz, weil sie keinen RandomAccessIterator unterstützt um mittels operator[] auf beliebige listenelementezuzugreifen.Es gibt da 2 Varianten einmal du verwendest std::advance oder du benutzt ein Container der Wahlfreien zugriff gestattet, was wohl die bessere Variante wäre.Sowas wie std::vector.
-
Hallo Firefighter!
Dankesehr für deine Antwort.
Hmm...nun kann ich mich nicht recht zwischen vector und list entscheiden.
Ich beschreibe mal die Situation:Für eine Spielintelligenz will ich einen Baum generieren, der halt die verschiedenen Spielzüge darstellt.
Ein Knoten hat daher wohl im Schnitt 35 Kinder (die Zahl ist vorher nicht bekannt, und kann auch sehr groß sein). Auf diese muss ich auch einzeln zugreifen können (natürlich).Wenn ich das Alpha-Beta_Pruning verwende, muss ich auch Äste des Baumes abschneiden können. Das hieße doch, dass ich auch Elemente in der Mitte der Liste u.U. löschen will.
An vector finde ich es sehr cool, dass man auf einzelne Elemente wohl sehr fix zugreifen kann. Die Anzahl der Elemente muss man aber dennoch nicht vorgeben.
Auf der anderen Seite reserviert sich son Ding natürlich eventuell unnötig viel Speicher. Elemente in der Mitte kann man langsamer löschen als bei einer Liste.
Also es ist ja so, dass ich für eine Spielsituation alle möglichen Züge berechne, für jeden Zug einen neuen Knoten. Das hieße, wenn ich weiß wie viele Züge es gab, steht der Speicher fest..
hmm.....
Hast du da einen klaren Favoriten?
-
Brauchst du wirklich Random Access, oder reicht es, nacheinander alle Elemente durchgehen zu können?
Denn sobald viele Löschoperationen am Anfang oder in der Mitte erforderlich sind, kann sich
std::list
auszahlen. Dafür hat man da ständige Indirektionen und Speicher muss für jedes Element einzeln beschafft werden. Im Weiteren gibt es in der Standardbibliothek auch nochstd::deque
, was eventuell einen Kompromiss darstellt.Wobei die Stärken und Schwächen der einzelnen Containertypen bei so wenigen Elementen (35 sind extrem wenig) kaum ins Gewicht fallen. Wenn du Random Access benötigst, kannst du mal
std::vector
nehmen und später immer noch schauen, ob sich andere Container von der Performance her besser verhalten, zum Beispiel mittels Zeitmessungen.
-
Ich kann mich da nur Nexus anschließen und als kleine Denkhilfe eventuell noch diese Bildchen mit dazu packen.
-
Danke euch!
hmm...wenn ich so drüber nachdenke, bin ich mir gar nicht mehr sicher, ob ich direct access brauche.dann wäre ja vermutlich doch list am besten.
Ich muss jetzt aber doch nochmal son bisschen doof fragen:
Ein iterator ist doch im Prinzip ein Zeiger, oder? Und mit diesem list iterator kann ich auf den Wert eines Elements zugreifen.Ich will jetzt aber einen Zeiger auf ein Element der Liste kriegen. Ich will also sowas wie Node* zurück geben.
Wie kriege ich also einen Node* Zeiger auf ein Element der Liste genau?
Sorry, ich bin ein bisschen verwirrt.
-
Zeige doch bitte erstmal deine List-Definition.