Implementieren einer eigenen Vektorklasse
-
Hallo Zusammen,
ich versuche mich gerade am selbstimplementieren von push_back und pop_back, allerdings stehe ich ein wenig auf dem Schlauch. Ich brauche für die beiden Methoden jeweils die Größe meines dynamischen Arrays (mit new erstellt), habe allerdings nur den Pointer auf mein Array data[].
class Vektor{ public: vector(); vector(int size); ~vector(); int& at(int pos); void push_back( int value ); void pop_back(); int size(); void resize(int size); void clear(); private: int* data; int size; }
Wie bekomme ich die Größe des Arrays data[]? Ich habe bereits gelesen dass sizeof() mir hier aufgrund des Pointers nicht weiterhilft.
-
Wenn du die interne Statusvariable "size" immer pflegst wenn ein Objekt hinzu kommt oder entfernt wird, musst du die Größe von "data" nie ermitteln sondern hast sie immer implizit in "size".
-
@saurerzipfel sagte in Implementieren einer eigenen Vektorklasse:
int size;
Du brauchst zwei Größen: allokiert und belegt.
-
@saurerzipfel OT: dir fehlen wichtige Funktionen. Stichwort Rule of 5
-
Diskussion über das Grundgerüst eines Vectors ab da: https://www.c-plusplus.net/forum/topic/351034/run-time-check-failure-2/40
@saurerzipfel sagte in Implementieren einer eigenen Vektorklasse:
// ...
Wo ist der Rest vom Code?
-
@Swordfish das ist die Anforderung. Ich versuche push und pop_back zu implementieren komme aber auf keinen Ansatz
-
@saurerzipfel sagte in Implementieren einer eigenen Vektorklasse:
@Swordfish das ist die Anforderung. Ich versuche push und pop_back zu implementieren komme aber auf keinen Ansatz
Wie genau brauchst du es denn? Bei einem simplen
int
-Vektor wie deinem kommt man auch mit einer sehr einfachen Implementierung davon. z.B.if (size == capacity) reserve(capacity * 2); data[size] = value; size++;
für
push_back
undif (size > 0) size--; // else UB für std::vector, also system("format c:") oder sowas (bitte NICHT!) ;-)
für
pop_back
.Wenn du es allerdings auf dem Niveau eines
std::vector
für beliebige TypenT
brauchst, dann wird es komplizierter. Dann solltest du den Speicher z.B. nicht mitnew T[]
reservieren, weil das dieT
direkt alle konstruiert. Da willst du dann lieber uninitialisierten Speicher verwenden (z.B. viaallocator.allocate()
geholt) und die Objekte inpush_back
via Placement-new
erzeugen. Da würde dann auch daspop_back
erfordern, dass du den Destruktor manuell aufrufst um die Objekte korrekt zu zerstören.Also, welches Niveau darf es sein? Für letzteres hat ja @Swordfish einen Link zu einer Diskussion gepostet:
@Swordfish sagte in Implementieren einer eigenen Vektorklasse:
Diskussion über das Grundgerüst eines Vectors ab da: https://www.c-plusplus.net/forum/topic/351034/run-time-check-failure-2/40
Ich denke da kannst du nachlesen, was es alles für einen "richtigen" Vektor braucht.
-
Hab da jetzt nicht wirklich viel Plan von Allokatoren und Placement-new, aber es gibt zwei yt-Videos, die sich damit im Detail auseinandersetzen:
Timur Doumler - Type punning in modern C++ und
Miro Knejp - Non-conforming C++: the Secrets the Committee Is Hiding From You ab 14:36Den letzten Talk kann man sich auch einfach zur Unterhaltung angucken, der Miro scheint ein lustiger Vogel zu sein.