Dynamisches Array vergrößern
-
Hallo zusammen,
ich habe ein Array, für das ich mit new Speicher angefordert habe:double* vVal; vVal = new double[anzahl];
Kann ich dieses Array im Nachhinein vergrößern?
Ich habe das bisher so gemacht:double *vValCpy=new double[anzahl]; //Temporäres Array zum Zwischenspeichern der Werte for(i=0;i<anzahl;i++)vValCpy[i]=vVal[i]; //Kopie der alten Werte delete []vVal; vVal = new double[anzahl+x]; for(i=0;i<anzahl;i++)vVal[i]=vValCpy[i]; //Zurückkopieren der Werte for(i=anzahl;i<anzahl+x;i++)vVal[i]=0; delete []vValCpy;
Das scheint aber irgendwie nicht so ganz zu funktionieren.
Jetzt meine zwei Fragen:
* Kann man ein Array noch vergrößern?
* Alternativ könnte ich natürlich auch einen Vector benutzen - wie sieht das mit der Geschwindigkeit aus - ich habe an der Stelle Vektoren vermieden, da ich im Hinterkopf habe, dass die langsamer sind als Arrays. Stimmt das?
Grüßle
Tiffi
-
Der Vektor macht das genau gleich, du könntest einfach Speicher vorrätige reservieren, oder wenn viel entfernt und eingefügt wird eine Liste benutzen.
Gruß
-
Du kannst auch vValCpy gleich anzahl+x groß machen, kopieren etc und dann die Pointer tauschen
Einmal kopieren gespart.
Ansonsten ist Vektor recht intelligent gemacht bei der Speichervergrößerung.
Da der Zugriff geinlined werden sollte, dürfte er genauso schnell sein wie ein gewöhnliches Array. Hängt aber natürlich immernoch von der Implementierung ab.
-
7H3 N4C3R schrieb:
Du kannst auch vValCpy gleich anzahl+x groß machen, kopieren etc und dann die Pointer tauschen
Einmal kopieren gespart.
Ansonsten ist Vektor recht intelligent gemacht bei der Speichervergrößerung.
Da der Zugriff geinlined werden sollte, dürfte er genauso schnell sein wie ein gewöhnliches Array. Hängt aber natürlich immernoch von der Implementierung ab.Wenn du mal Programme schreiben solltest wo die Performanceunterschiede zwischen
Array und Vector ins Gewicht fallen, zu dem Zeitpunkt weisst du sicher die
Unterschiede auch ohne das du hier nachfragen musst.
-
Du kannst auch vValCpy gleich anzahl+x groß machen, kopieren etc und dann die Pointer tauschen
Einmal kopieren gespart.
Das klingt interessant. Pointer tauschen heißt hier: vVal*=vValCpy*;
Aber dynamisch vergrößern lässt sich ein Array also nicht. Beim Kopieren der Daten ins vValCpy bekomme ich einen Abbruch.Ansonsten ist Vektor recht intelligent gemacht bei der Speichervergrößerung.
Da der Zugriff geinlined werden sollte, dürfte er genauso schnell sein wie ein gewöhnliches Array. Hängt aber natürlich immernoch von der Implementierung ab.Das sind halt bis zu 100.000 Arrays mit ca. 30 doubles. Wenn der geinlinede Zugriff genauso schnell ist, dann wäre das natürlich wirklich eine sicherere Alternative.
Grüßle
Tiffi
-
So sollte es wohl aussehen
:
{ double *vValCpy = new double[anzahl]; for(i=0;i<anzahl;i++) vValCpy[i]=vVal[i]; delete []vVal; vVal = vValCpy; }