dynamische Speicherverwaltung (Arrays)
-
Hallo,
es besteht folgende Aufgabenstellung:
Es können beliebig viele Zahlen eingegeben werden...
Das Array, in dem die Zahlen stehen, soll immer genau so groß sein, wie die Anzahl der Zahlen, die er bereits eingegeben hat (Hat der Benutzer z. B. 20 Zahlen eingegeben, dann darf auch nur Speicherplatz für 20 Zahlen belegt sein).d.h. doch, dass ich immer wieder die Größe des Arrays ändern muss.
Gibt es in C++ sowas REDIM...PRESERVE wie in VB?
-
testor schrieb:
Hallo,
es besteht folgende Aufgabenstellung:
Es können beliebig viele Zahlen eingegeben werden...
Das Array, in dem die Zahlen stehen, soll immer genau so groß sein, wie die Anzahl der Zahlen, die er bereits eingegeben hat (Hat der Benutzer z. B. 20 Zahlen eingegeben, dann darf auch nur Speicherplatz für 20 Zahlen belegt sein).d.h. doch, dass ich immer wieder die Größe des Arrays ändern muss.
Gibt es in C++ sowas REDIM...PRESERVE wie in VB?Was sagt denn das Lernmaterial (Buch, Skript, etc.) dazu ?
Gruß,
Simon2.
-
in c++ gibt es std::vector!
oder ein dynamisches array welches du immer per hand die neue größe zuweist!
-
ser1al_ausgeloggt schrieb:
in c++ gibt es std::vector!
oder ein dynamisches array welches du immer per hand die neue größe zuweist!Verbleiben wir einfach bei den den Kontainern der STL.

-
Das ist zwar in C++ nicht gerne gesehen (da nimmt man lieber die STL-Container vector<>, deque<> oder list<> (je nach Anwendung) für dynamisch erweiterbare Arrays), aber es gibt auch noch die C-Speicherverwaltung über malloc(), realloc() und free().
new/delete hat kein Äquivalent zu realloc(), aber du kannst es im Notfall nachbauen.
-
wir haben noch nichts mit vector gemacht! (das kanns also nicht sein!
)int *array = new int[eine_Zahl];wenn er nun die zweite Zahl eingibt, muss ich mein array um 1 feld
vergrößern.
Kann man das irgendwie machen ohne die erste Zahl zu verlieren?
in vb geht das mit redim ..preserve, gibt es sowas auch in c++?
gruß testor
-
testor schrieb:
wir haben noch nichts mit vector gemacht! (das kanns also nicht sein!
)int *array = new int[eine_Zahl];wenn er nun die zweite Zahl eingibt, muss ich mein array um 1 feld
vergrößern.
Kann man das irgendwie machen ohne die erste Zahl zu verlieren?
in vb geht das mit redim ..preserve, gibt es sowas auch in c++?
gruß testorNicht wirklich.
Du musst neuen Speicher besorgen (der entsprechend größer ist), den alten Inhalt dahin kopieren, das neue Element hinzufügen und den alten Speicher löschen.
... und natürlich ab da mit einem Zeiger auf den neuen Speicher arbeiten.
(ich vermute, dass VB da - zumindestens ab einem gewissen Punkt - intern auch nichts Anderes macht. Auch VB kann nicht zaubern und irgendwann "kommt da was im Speicher" ...)Gruß,
Simon2.
-
Direkt den Speicher vergrößern kannst du nicht (C hatte realloc(), aber das solltest du nicht mit new/delete kombinieren), also bleibt dir nur eins:
- größeren Speicherblock reservieren
- alle Elemente kopieren
- alten Speicherblock freigeben
(btw, std::vector arbeitet intern nach dem selben Verfahren - wobei er mitunter etwas Reservespeicher vorrätig hält, um nicht bei jeder Vergrößerung den kompletten Datenblock kopieren zu müssen)
-
Nein, geht nicht so einfach. Wenn es so einfach wäre, würde es kein std::vector geben.

-
hallo, falls du englisch kannst, könnte es hilfreich sein, hier nachzulesen.