Undefinierte Anzahl von Variablen in Zeigern reservieren
-
Ich musste in der letzten Zeit viel nachholen was Zeiger und Klassen angeht,
mitlerweile scheine ich es langsam zu verstehen! Nun Frage ich mich wie ich Im nachinein speicher für den Zeiger reservieren kann? Hier man ein Beispiel: #include <iostream.h> void main(void) { int *Zeiger = NULL; Zeiger = new int[20]; for(int i = 0; i < 20; i++) } Zeiger[i] = i; } for(i = 0; i < 20; i++) { cout<<Zeiger[i]<<endl; } delete [] Zeiger; }Das Problem ist nun, das es fest definiert ist das nur 20 speicher reserviert werden! Ich weiß aber vorher nicht wie viel ich nun brauche, ob ich nur einen brauche oder 50000! Wie kann ich also im nachinein speicher reservieren? Ich möchte das dann in etwa so benutzen:
int* zeiger; zeiger + 0 = 60; zeiger + 1 = 953; zeiger + 2 = 49945; zeiger + 19 = 84; zeiger + 17 = 485;Nun wie könnte ich dies machen?
-
Code-Walker schrieb:
#include <iostream.h> void main(void)Das ist ja die reinste Hölle. Der Header heisst <iostream>, und
main()hat schon immerintzurückgegeben!Zu deinem Problem:
Entweder du löschst das Array mitdelete[]und erstellt ein neues, das deiner Dimension entspricht.Oder, was viel komfortabler und sicherer ist, du benutzt
std::vector.
-
Oder std::map<int, int>, wenn du nicht alle Stellen füllst.
-
Die erste variante schwebte mir auc vor, aber ist ziehmlich unkomfortabl. Vectoren kenne ich leider nur aus der Mathematik, ich erkenne dort lider keinen zusammenhang

Könnte mir jemand kurz auf die sprünge helfen? Aus der MSDN werd ich nicht schlau.
-
Hallo
Das ist alles sehr gut in unseren Forumsartikeln zum Thema STL-Container erklärt.
bis bald
akari
-
Code-Walker schrieb:
Die erste variante schwebte mir auc vor, aber ist ziehmlich unkomfortabl. Vectoren kenne ich leider nur aus der Mathematik, ich erkenne dort lider keinen zusammenhang

std::vector hat nichts mit den Vektoren aus der Schule zu tun. (OK man kann einen simulieren, ist aber nicht gerade die feine Art).
std::vector ist eigl. eine sichere/dynamische Variante eines Arrays.
-
In einem aktuellen C++-Buch (oder Tutorial) deiner Wahl sollten eigentlich auch zumidnest die Grundlagen der Standardbibliothek behandelt werden, wie eben auch dem Container std::vector. Der macht unter der Haube nicht viel anderes als ein dynamisches Array zu verwalten und übernimmt für dich das delete[] und new[] sowie weitere nötige Arbeiten.
Ich habe aktuell oben fett geschrieben weil deine Quellen nicht aktuell zu sein scheinen: <iostream.h> ist veraltet und feiert inzwischen das 10-jährige Rentenjubiläum (der C++Standard ist von 1998). int main() stand afaik schon im ARM von 1993 - eine Quelle die dir erzählt dass void main() ok ist, muss also noch älter sein...
-
http://www.linuxsoftware.co.nz/containerchoice.png
in Kombination mit
http://www.cppreference.com
-
Fellhuhn schrieb:
http://www.linuxsoftware.co.nz/containerchoice.png
in Kombination mit
http://www.cppreference.comIch mag:
http://www.cplusplus.com/reference/besser. Ist vollständiger.

-
drakon schrieb:
Code-Walker schrieb:
Die erste variante schwebte mir auc vor, aber ist ziehmlich unkomfortabl. Vectoren kenne ich leider nur aus der Mathematik, ich erkenne dort lider keinen zusammenhang

std::vector hat nichts mit den Vektoren aus der Schule zu tun. (OK man kann einen simulieren, ist aber nicht gerade die feine Art).
std::vector ist eigl. eine sichere/dynamische Variante eines Arrays.
Die Namensgebung ist hier wirklich irreführend, da ein Array eher einem Tupel entspricht. Die Mehrheit der Leute kennt wohl einen Vektor nur als ein Tupel von Zahlen, aber ein mathematischer Vektor ist viel allgemeiner gefasst: Elemente aus einem Vektorraum heißen Vektoren und ein Vektorraum muss nicht aus irgendwelchen Zahlentupeln bestehen.
Lustigerweise heißt die Klasse die man tatsächlich für Vektoren nutzen kann std::valarray

-
Danke, das main() und <iostream.h> veraltet sind ist mir bewusst. Das Problem bei den Vektoren ist nun, das ich schon einen zeiger benutzen sollte, da es bei mir um größere mengen daten geht die ständig von Klasse zu Klasse wandern. Es währe ziehmlich blöd wenn ich das ganze dann kopiere, wenn ich stadtdessen einfach einen zeiger rüber schicke. Aber auf vector ann man dann ja einen zeiger anwenden

-
Code-Walker schrieb:
Danke, das main() und <iostream.h> veraltet sind ist mir bewusst.
Stimmt, du wolltest uns mit dem Beispiel ja nur testen...

Abgesehen davon istmain()nicht veraltet, war es nie.Das Problem bei den Vektoren ist nun, das ich schon einen zeiger benutzen sollte, da es bei mir um größere mengen daten geht die ständig von Klasse zu Klasse wandern. Es währe ziehmlich blöd wenn ich das ganze dann kopiere, wenn ich stadtdessen einfach einen zeiger rüber schicke. Aber auf vector ann man dann ja einen zeiger anwenden

Nun ja, wenn du Zeiger in Vektoren speicherst, kannst du dich wieder selber um die Speicherverwaltung kümmern. Bei grossen Objekten könnte man auch
std::listoderstd::dequein Betracht ziehen, weil da nicht (beidequevielleicht) der halbe Container reallokiert werden muss, wenn es mitten drin Einfügungen und Löschungen gibt. Kommt eben drauf an, welche Operationen du benötigst.
-
Hmm ... Zeiger ist da schon wichtig! Von list und dem anderen habe ich überhaupt keine Ahnung. Kann ein Vektor eigentlich auch eine Klasse haben? also:
class K;
vector<K> data;
Ich habe leider auch keine Ahnung von templates ^^
Abgesehen davon ist main() nicht veraltet, war es nie.
Hab mich nur versprochen. Ich sollte lansgam aufhören mich raus zu reden

-
Code-Walker schrieb:
Hmm ... Zeiger ist da schon wichtig! Von list und dem anderen habe ich überhaupt keine Ahnung.
Von
std::vectorscheinbar auch nicht gerade viel. Wieso liest du nicht den von atari geposteten Artikel zur STL? Da wird alles schön erklärt.Und über Templates solltest du dich bei Gelegenheit auch informieren.
-
Mach ich doch. leider kann ich au dem text nicht entnehmen, ob bei vectoren nun Klassen möglich sind oder nicht ...
-
Code-Walker schrieb:
Mach ich doch. leider kann ich au dem text nicht entnehmen, ob bei vectoren nun Klassen möglich sind oder nicht ...
Vectoren sind für jeden vollständig definierten Typen möglich, also auch für Klassen.

Steht übrigens in dem Artikel:
Wie der Name schon andeutet, sind die einzelnen Komponenten der STL als Templates aufgebaut. Das hat den Vorteil, dass sie mit beliebigen Datentypen und Erweiterungen zusammenarbeiten können.
-
Ach das ist damit gemeint, danke

Was für eine hohe anzahl an werten kann so ein vector denn haben, bevor er so zu sagen einen zweiten anlegt? Weil wenn es noch unter 1000 ist sllte es noch gehen!
-
Code-Walker schrieb:
Ach das ist damit gemeint, danke

Was für eine hohe anzahl an werten kann so ein vector denn haben, bevor er so zu sagen einen zweiten anlegt? Weil wenn es noch unter 1000 ist sllte es noch gehen!
Die Standardcontainer können so viele Objekte aufnehmen, wie es Speicher hat.
Also sehr viele in Normalfall.
-
Code-Walker schrieb:
Ach das ist damit gemeint, danke

Was für eine hohe anzahl an werten kann so ein vector denn haben, bevor er so zu sagen einen zweiten anlegt? Weil wenn es noch unter 1000 ist sllte es noch gehen!

std::vector<DeinTyp> v(1000);Da hast du ein std::vector-Objekt, genau eins, mit reserviertem Speicherplatz für 1000 Einträge. std::vector kümmert sich intern selbst um den speicher, allokiert evt. auch mehr als nötig.
-
Also kann ich doch gleich einen zeiger benutzen? Mir geht es hauptsächlich darum, das man vorher einfach nicht weiß, wie viele Speicher man hat. Und es soll auch nicht vorher speicher reserviert sein. Mir geht es darum, im nachhinein speicher hin zu zu fügen. Ob neue speicher einfach hinten dran gehangen werden, oder wo man will, ist mir nicht so wichtig.
Das gane soll dann halt so aussehen:
int* zeiger[]; zeiger + 0 = 900; zeiger + 1 = 700; zeiger + 2 = 100;leider muss ich ja aber das ganze so realisieren:
int* zeiger[1000];Wenn ich gerade mal 5 speicher benötige, habe ich unnötige 995 speciher belegt ...
-
Lies doch endlich mal, was wir dir gepostet haben. Das ist alles mit std::vector möglich.