Frage zur "std::vector" Klasse
-
Hi,
ich vermute mal, dass die "vector" Klasse aus der STL. nicht bei jedem "push_back" erneut "new" aufruft und den alten Speicher in den neuen größeren kopiert. Soweit ich weiß allokiert die Klasse immer erst neuen Speicher wenn der zuvor angeforderte wieder voll ist.
Also müsste die Klasse mindestens 3 Komponenten haben, ungefähr so:template <class T> class vector { /* ... */ private: T* data; // der Speicher pointer int length; // tatsaechliche leange des Speichers int used_length; // benutze laenge des Speichers };Wenn das in keinster Weise der Fall ist, korrigiert mich bitte. Falls es zum Teil richtig ist, dann ist meine eigentliche Frage folgende:
um wie viel Elemente vergrößert die Klasse vector den Speicher, wenn neuer Speicher angevordert werden muss?
-
normalerweise verdoppelt
-
Bist du sicher? Das würde dann irgendwann ziehmlich groß werden, oder?!
-
C++ ist Open-Source, guck in den Kot

-
LukasBanana schrieb:
Bist du sicher? Das würde dann irgendwann ziehmlich groß werden, oder?!
Vielleicht brauchst du ja auch irgendwann ziemlich viele Elemente?
Soviel ich weiss, ist das Vergrösserungsverhalten nicht im C++-Standard geregelt. Viele Implementierungen benutzen allerdings die Verdoppelungsstrategie. Im Weiteren kannst du solche Dinge auch nachschauen, indem du den Code deiner Standardbibliothek öffnest. Oder indem du mit
capacity()experimentierst...
-
LukasBanana schrieb:
Bist du sicher? Das würde dann irgendwann ziehmlich groß werden, oder?!
Dann ist der vector aber auch vielleicht die falsche Wahl gewesen (Wenn man die Größe abschätzen kann muss man reserve einsetzen).
-
Ich weiss nicht ob verdoppeln üblich ist. Ich habe mal gesehen dass Faktor 1,5 verwendet wurde.
Eine Vergrösserung um fixe oder "gedeckelte" Beträge ist auf jeden Fall nicht möglich, da der Standard z.B. für push_back amortisiert konstante Laufzeit vorscheibt.
-
Wenn die STL nicht so extrem frickeligen Code hätte... unmenschlich...