Undefinierte Anzahl von Variablen in Zeigern reservieren
-
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.
-
Das mache ich doch:
std::vector<DeinTyp> v(1000);Ich reserviere einen speicherplatz von 1000, jetzt habe ich genau das selbe als wenn ich ein array benutzen würde ...
Oder habe ich da etwas falsch verstanden?
-
sry, doppel post ...
Das obige ist doch nun das selbe, als wenn ich
int v[10];benutzen würde ...
-
Code-Walker schrieb:
sry, doppel post ...
Das obige ist doch nun das selbe, als wenn ich
int v[10];benutzen würde ...
Lies mal das hier:
http://www.cplusplus.com/reference/stl/vector/Mit einem vector kannst du ganz viel tolle Sachen machen. Und natürlich auch die Grösse zur Laufzeit ändern. push_back und resize sind da ganz interessant..
-
Ja, ich habe mir in der MSDN mal die ganzen member der vector klasse angesehen, und da habe ich gesehen was push_back() macht:
http://msdn.microsoft.com/en-us/library/k449z507(VS.71).aspx
Der Vector scheint genau das zu machen was ich brauche, da stellt ich mir nurnoch eine Frage:
Bei Überschreitung der Kapazität werden alle vorhandenen Elemente in einen neuen (entsprechend größeren) Speicherbereich umkopiert - dadurch werden erstens alle Referenzen, Zeiger und Iteratoren, die auf Elemente des Vektors zeigen, ungültig gemacht und zweitens kostet diese Operation recht viel Zeit
Also, wenn ich die kapatzitätüberschreite, werden die werte einfach in einen neuen speciherbereich umkopiert. Wenn ich nun einen zeiger auf minen Vector habe, dann ist dieser leider nurnoch unbrauchbar. Wie hoch ist nun die kapatzität des Vectors? Oder ist sie undefiniert, solange ich keine kapatzität angebe?