Vector für "komplexe Datentypen"
-
Hey,
kann es sein, dass "vector" nicht dafür geeignet sind um komplexere Datentypen zu speichern? Mit komplexer Datentyp mein ich im Prinzip einfach etwas selbst geschriebenes. Folgendes gibt bei mir z.B. einen Fehler:
std::vector<Wall*> walls; // <-- Wall ist dabei eine Class von mir walls.insert(w); // <-- FehlerFehlermeldung:
no matching function for call to 'std::vector<Wall*>::insert(Wall*&)'Mach ich etwas falsch oder kann vector nur primitive Datentypen behandeln?
Falls vector also meine Wände nicht speichern kann, wie macht man sowas in C++ für gewöhnlich? Arrays sind insofern ungeeignet als dass ich eine variable Größe brauche.
Meine Notfalllösung wäre, dass ich mir eine Linked List Struktur baue, wie man es "damals" in C gemacht hat, vielleicht geht das aber eleganter und ihr könnt mir helfen
-
Djinndrache schrieb:
kann es sein, dass "vector" nicht dafür geeignet sind um komplexere Datentypen zu speichern?
doch klar kann er das.
Djinndrache schrieb:
Folgendes gibt bei mir z.B. einen Fehler:
Du willst nicht insert() sondern push_back().
-
Ah, so mag ich den vector doch gleich

Der vector spielt scheinbar auch gleichzeitig stack, mh? Kann ich bestimmt nochmal gebrauchen

Danke
-
Es gibt auch std::stack

-
dot schrieb:
Es gibt auch std::stack

Mh wozu, wenn der Vektor selber pushen und poppen kann?
-
Ich habe noch nie std::stack eingesetzt.
-
Djinndrache schrieb:
dot schrieb:
Es gibt auch std::stack

Mh wozu, wenn der Vektor selber pushen und poppen kann?
Weil man mitunter die übrigen Methoden des vector's nicht benötigt (btw, std::stack ist kein Container, sondern ein Adapter, der im Inneren einen normalen STL-Container verwaltet).
Zu deinem ursprünglichen Problem: insert() erwartet nicht nur den einzufügenden Wert, sondern auch die Position, wo der hingeschrieben werden soll. Und
v.push_back(x);ist eine Abkürzung fürv.insert(x,v.end());.
-
Ah, verstehe

Dann ist in meinem Fall push besser, da es mir egal ist in welcher Reihenfolge die Engine die Wände generiert. Aber gut zu wissen

Danke
-
Djinndrache schrieb:
Ah, verstehe

Dann ist in meinem Fall push besser, da es mir egal ist in welcher Reihenfolge die Engine die Wände generiert. Aber gut zu wissen

Danke
Wenn du insert nutzen würdest, dann müssten alle bereits im vector befindlichen Elemente nach der insert-Position umkopiert werden (unter der Annahme, dass die Kapazität des vectors ausreicht und nicht ohnehin neuer Speicherplatz angefordert werden muss), um Platz zu schaffen für das neue Element.
Bei einem push_back muss das natürlich nicht gemacht werden, da das neu einzufügende Element ohnehin ans Ende kommt.
-
Djinndrache schrieb:
Hey,
kann es sein, dass "vector" nicht dafür geeignet sind um komplexere Datentypen zu speichern? Mit komplexer Datentyp mein ich im Prinzip einfach etwas selbst geschriebenes. Folgendes gibt bei mir z.B. einen Fehler:
std::vector<Wall*> walls; // <-- Wall ist dabei eine Class von mir walls.insert(w); // <-- FehlerFehlermeldung:
no matching function for call to 'std::vector<Wall*>::insert(Wall*&)'Mach ich etwas falsch oder kann vector nur primitive Datentypen behandeln?
Nö, du machst was falsch

Dein Vektor speichert Zeiger auf Wall Objekte, du versuchst aber ein normales Wall Objekt drin abzulegen, damit kommt der Vektor aber nicht klar.Djinndrache schrieb:
Falls vector also meine Wände nicht speichern kann, wie macht man sowas in C++ für gewöhnlich? Arrays sind insofern ungeeignet als dass ich eine variable Größe brauche.
Meine Notfalllösung wäre, dass ich mir eine Linked List Struktur baue, wie man es "damals" in C gemacht hat, vielleicht geht das aber eleganter und ihr könnt mir helfen
Wenn du dein Schnitzel gern mit ´ner Pinzette ist kannst du das machen, ich würde aber trotzdem std::vector benutzen.
-
...abgesehen davon ist ein Zeiger nicht komplex.