STL list
-
Ich verstehe gerade nicht wie man sich den Inhalt eines Listenelements anzeigen lassen kann? Geht das wirklich nur per back() bzw. front()?
Ich habs schon so versucht:
while(listiterator != players.end()) { string bla = listiterator; cout<<"Name: "<<bla<<endl; listiterator++; }
Falls ja, wo sind die Vorteile einer List gegenüber eines vector (oder soll gerade diese einschränkung ein Vorteil sein)?
Jetzt sitz ich hier und weiß nicht welchen Container ich nehmen soll, könntet ihr einen empfehlen:
Ich habe eine Klasse die soll Namen aus einer Datei auslesen. Zu jedem Namen soll eine Klasse angelegt werden und per Pointer (sollen in einem Container gespeichert werden) kann man auf sie zugreifen.
Jede Klasse Name enthält Nachrichten die ihr auch als neu erstelle Klasse zugewiesen werden, der Zugriff soll auch wieder durch Pointer, gespeichert in einem Container realisiert werden.
Hättet ihr eine Idee? Oder würdet ihr das ganz anders lösen?
-
cout<<"Name: "<< *listiterator <<endl;
Du musst den Iterator einfach nur dereferenzieren!
-
Hallo!
Versuch's mal mit
string bla = *listiterator;
das dürfte besser funktionieren. Ob es dann bereits komplett funktioniert kann ich nicht sehen, da der Code-Auschnitt zu klein ist. Insbesondere fehlen Typ und Initialisierung des Iterators.
Jetzt zum Rest, was kann list. List hat den Vorteil, daß man in konstanter Zeit an jeder beliebigen Stelle in der Liste Werte einfügen und löschen kann. Bei vector geht das nicht, weil dort sonst Löcher entstehen würden und die Element zusammengeschoben werden müßten... was Zeit kostet.
Wenn Du aber immer nur hintenanhängst oder weglöschst, dann ist ein vector vollkommen ausreichend.
Wichtig ist auch, daß Du nicht in konstanter Zeit auf das n-te Element zugreifen kannst, sondern Du mußt die ersten n Element durchlaufen um dorthin zu kommen. Unschön, aber so isses halt. Bei vector ist der Aufwand für den Zugriff immer gleich groß, egal welches Element.Von dem was Du da erzählt hast würde ich sagen nimm einfach nen vector. Sieht nicht so aus, als bräuchtest Du ne list.
MfG Jester
-
Danke sehr!
Was ich sehr schade finde ist das ein Vector leider keine Uniquemethode besitzt.
Wenn ich in einem Fall keine doppelten Elemente haben will muss ich das selber prüfen, bei einer list wärens 3 Zeilen gewesen (auslesen, .unique, .sort)
Und ich hätte einen schönen Container gehabt.Was ich persönlich bei einer STl gebrauchen könnte wäre ein weiterer überladenener Konstruktor der Container von anderen Typen annehmen würde.
So könnte man einen vector mit einer List initialisieren (aber wahrscheinlich macht das alles gar kein Sinn und ich merk das gerade nicht).
Gut, ich bleib dann erstmal bei vector.
-
wie wär's mit folgendem:
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(),vec.end()), vec.end());Dann ist der Vektor sortiert und es sind keine doppelten mehr drin.
MfG Jester
-
hjk schrieb:
Danke sehr!
Was ich sehr schade finde ist das ein Vector leider keine Uniquemethode besitzt.
Wenn ich in einem Fall keine doppelten Elemente haben will muss ich das selber prüfen, bei einer list wärens 3 Zeilen gewesen (auslesen, .unique, .sort)
Und ich hätte einen schönen Container gehabt.Was ich persönlich bei einer STl gebrauchen könnte wäre ein weiterer überladenener Konstruktor der Container von anderen Typen annehmen würde.
So könnte man einen vector mit einer List initialisieren (aber wahrscheinlich macht das alles gar kein Sinn und ich merk das gerade nicht).
Gut, ich bleib dann erstmal bei vector.
Die Container bieten nur das an, was sie effizient können. Inserten und erasen kann ein vector nicht besonders gut.
Das mit den Konstruktoren wäre nicht sehr einfach erweiterbar. Wenn du einen FooContainer zur STL hinzufügen würdest, müsstest du bei allen Containern noch einen Konstruktor ergänzen. Eine Lösung wäre hier Vererbung gewesen, dann hätte man einen Konstruktor vector(collection c) oder vector(sequence s) machen können. Darauf hat man jedoch in der STL verzichtet.
-
Ich danke euch vielmals!
-
hjk schrieb:
Danke sehr!
Was ich sehr schade finde ist das ein Vector leider keine Uniquemethode besitzt.
Zum Interface einer Klasse gehören nicht nur die Methoden der Klasse selbst, sondern auch die freistehenden Funktionen, welche die Klasse als Methoden akzeptieren. In <algorithm> gibt es sehr viele Funktionen, die auch std::vector akzeptieren.
hjk schrieb:
Danke sehr!
Was ich sehr schade finde ist das ein Vector leider keine Uniquemethode besitzt.
Wenn ich in einem Fall keine doppelten Elemente haben will muss ich das selber prüfen, bei einer list wärens 3 Zeilen gewesen (auslesen, .unique, .sort)
Und ich hätte einen schönen Container gehabt.Das sort machst du hoffentlich vor dem unique, denn sonst hast du keine Liste ohne doppelte Einträge.
-
hjk schrieb:
Danke sehr!
Was ich persönlich bei einer STl gebrauchen könnte wäre ein weiterer überladenener Konstruktor der Container von anderen Typen annehmen würde.
So könnte man einen vector mit einer List initialisieren (aber wahrscheinlich macht das alles gar kein Sinn und ich merk das gerade nicht).
Gut, ich bleib dann erstmal bei vector.
Diesen Konstruktor gibt es eigentlich in jedem Container und zusätzlich eine passende assign Methode
std::vector vec(list.begin(), list.end());
-
@hjk
Allgemein:
der zugriff auf deine Containerobjekte sollte bestimmen, was fuern container du nimmst .....
alle container haben Vor und Nachteile.
Brauchst du die Vorteile mehrerer Container, solltest du die container combinieren !
kleine Hilfestellung:
Vector:
brauchst du den zugriff ueber den Index nicht (5. Element und so ... ) oder sortierst deinen container oefters um (so dass nach dem sortieren das 5. element nimmer das 5.te ist) ... ist nen vector hochstwahrscheinlich die falsche Wahl. Vector nimmt man nur wegen dem Index ... aber da viele von C kommen und da die C-Arrays kennen, sitzt das noch zu tief im blut, statt iterieren wird per index zugegriffen etc ... die nachteile des Vectors sind nicht ohne !Set / Map
es gibt Container die sortieren fuer dich .... und werfen dir exceptions, wenn du gleiche elemente einfugen willst ... Ausserdem ist der zugriff ueber die Elemente als key "wahnsinnig" schnell (weil verweise auf die Objecte schon organisiert abgelegt werden , Hash tables etc ... ) . Die art der sortierung kannst ueber die Sortiermethode selber festlegen ....mit combinieren mein ich:
Du brauchst nen container, der seine elemente nicht selbstaendig umkopiert ... Liste eignet sich ganz gut.
den nimmst zum halten der daten ....
Zum sortieren kannst dann Sets / Maps etc dynamisch erzeugen, mit generischen sortiermethoden .... und pointern / Referenzen auf die elemente in der liste als Inhalt deines Sets/ Maps ....Ciao ...
-
Die STL bietet ganz schön viele Möglichkeiten für einen Anfänger wie mich, aber ich finde es echt toll das ihr mir so helft