Kann man Arrays dynamisch vergrößern?
-
Kann man Arrays dynamisch vergrößern? Also ich meine so ich habe ein Array definiert:
int *i = new int[10];
merke jetzt aber später, dass ich doch 20 integer in das Array packen will. Jetzt muss ich das Array größer machen, ohne alles zu löschen und ein neues anzulegen. Geht das irgenwie?
-
Hi,
void* p = new int[10]; void* pNeu = new int[20]; memcpy(pNeu, p, sizeof(int) * 10); delete[] p; p = pNeu;
Anders geht's nicht, realloc() ist C.
ChrisM
-
deswegen benutzt man auch die ganzen tollen STL-Container, wie zB. std::vector
-
Hi,
die verwenden aber intern auch meine Methode. Trotzdem stimme ich dir zu, man sollte sie allein schon wegen der Sicherheit (Stichwort Bereichsprüfung) verwenden.
ChrisM
-
@ChrisM
nur arbeitet std::vector mit einem cache, so das nicht bei jeder push-Operation unbedingt neuer Speicher reserviert wird etc. Ist alles eben komfortabler
-
Meinst du es wird beim Erzeugen des Objekts vom Typ vector gleich eine feste Anzahl von dynamischem Speicher zugelegt und wenn diese überschritten wird, wird eine noch größere Anzahl erzeugt und die alten Elemente werden in diese teilweise kopiert?
-
jo, siehe auch std::vector::reserve und std::vector::capacity
-
Danke, ich war mir nur bei meiner Theorie nicht wirklich sicher. Es gibt in dem Fall allerdings einen Überlauf, aber ob das wirklich schlimm ist?
-
wieso nicht einfach anstatt der 10, eine variable nehmen?
-
ChrisM schrieb:
die verwenden aber intern auch meine Methode.
Verwenden die nicht den Copy-Constructor anstelle memcpy? Ich bin mir gerade nicht sicher...
-
Hi,
ja, die verwenden AFAIK den Copykonstruktor. Mit Methode meinte ich eigentlich nur, dass sie halt kein realloc() verwenden.
ChrisM
-
Woher wisst ihr denn wie das genau aufgebaut ist? Ich kann das nur raten...
-
weil es einen Standard gibt, der einige Voraussetzungen stellt.
Siehe 23.1 im ISO C++ Standard.
Ansonsten schau dir einfach mal die Standard-Library Implementierungen an