Undefinierte Anzahl von Variablen in Zeigern reservieren
-
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?
-
Code-Walker, dein Elan in allen Ehren, allerdings scheint mir dass dir für die Umsetzung deiner Ideen noch eine Menge Grundwissen fehlt. Auch wenns erstmal so aussieht dass es dich deinem Ziel nicht unmittelbar näher bringt solltest du dein aktuelles Projekt für ein paar Tage beiseite legen und dich durch ein oder zwei gute Tutorials bzw. Einsteigerbücher arbeiten. Du wirst staunen wie sehr das deinem Verständnis der Sprache und dadurch auch deinem Projekt hilft!
-
Code-Walker schrieb:
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?
1. Es werden die Zeiger auf die Elemente ungültig, nicht aber auf den Vector als solchen (Der Vector ist eine Klasse die intern das Speicherhandling macht, die Vektorinstanz wird nicht umkopiert, sondern der Speicherbereich der vom Vector verwaltet wird). Dies ist in sofern für dich relevant das du keine Iteratoren/Zeiger/Referenzen auf Elemente im Vector längerfristig halten soltest.
2. Normalerweise hält man den std::vector als Element und nicht als Zeiger (Eher passiert es das man ein vector für Zeigertypen definiert). Die Container der Standardbibliothek haben ja gerade (unter anderem) den Sinn das man sich nicht um das Speicherhandling kümmern muss.
3. Wie der vector den Speicher verwaltet sollte dir eigentlich relativ egal sein, wichtig ist nur das wenn du vorher abschätzen kannst wieviele Elemente kommen, vielleicht die ungefähre Größe angibst, damit seltener kopiert wird. In der Regel ist eine der Standardtaktiken des Vectores mit einer bestimmten Anzahl (z.B. 100) zu beginnen, und bei jeder Überschreitung dieser Grenze per push_back die Anzahl zu erhöhen (In der Regel in etwa verdoppeln). Der vector ist nur durch die Grenzen der Größe beschränkt, die auch bei dynamisch erzeugten Arrays gelten.
4. Ich schließe mich pumuckl an: Lies erstmal ein sinnvolles C++ Buch (z.B. C++ Primer, Thinking in C++ ...).
cu André
-
Code-Walker schrieb:
Also kann ich doch gleich einen zeiger benutzen? ...
Code-Walker schrieb:
...jetzt habe ich genau das selbe als wenn ich ein array benutzen würde ...
Ein "Zeiger" allein wird Dir aber nicht reichen. Du wirst an Funktionalitäten noch brauchen:
- Daten zu setzen/verändern
- Länge verwalten
- "über das Array wandern" (z.B. mit einem Index oder Zeigerarithmetik)
- Kopien des Arrays (bzw. von Teilen) erstellen
- ...
(Es kann sein, dass Du das in Dein Programm "reinstrickst", aber letztlich wird das Programm dadurch keinesfalls kleiner/schneller.)All das (und zwar GENAU das) hat schon mal jemand geschrieben und std::vector genannt - warum also nochmal tun ?
Warum denken eigentlich soviele Newbies, dass std::vector im Hintergrund nur Speicherbausteine verkokeln, CPU-Beinchen verbiegen und die Kreditkartendaten des Benutzers an Microsoft versenden würde ?
std::vector kann Dir kostenlos viiiiel Arbeit (und Mühen und Fehler) abnehmen -> nimm es.
Gruß,
Simon2.
-
Ich sitze schon an ein paar Tuts, nur hatte ich vorher nie etwas mit vectoren, templates und klassen zu tun, darum hatten dise mich auch nicht interessiert, aber nun sind mir diese sehr nteressant geworden. Mein Problem ist nun, das ich größere Datenpackete habe, in meiner klasse die ich übemitteln will, sind wieder mehrere 1000 floats gespeichert, deswegen ist es mir wichtig einen zeiger zu verwenden. Ich würde gerne einen zeiger auf die vector elemente anwenden, also, das ich tatsächlich keine klasse in dem vector habe, sondern einen Zeiger, der auf eine Klasse zeigt. Wenn ich dies so machen würde:
Meine_Klasse K; vector<Meine_Klasse> v(&K);Dabei würde der vector das Objekt annehmen, nicht den zeiger
