Konstruktor mit STL vector anlegen
-
Hallo !
Ich habe eine Klasse (-> Zahlenliste) und ein private Datenelement zahlen vom STL Typ vector<int>.
Nun soll ich einen Konstruktor mit einem int Parameter für die Anzahl der enthaltenen Zahlen (die Liste soll n Elemente haben , die je eine zufällige Zahl sind) erstellen.
Kann ich mit meinem vector , der zahlen heisst, so umgehen wie mit einem Array?Oder warum gibt mein Code hier einen Fehler?
#include<iostream> #include<vector> #include<algorithm> using namespace std; class Zahlenliste{ private: vector<int> zahlen; public: Zahlenliste(int n):zahlen(n){ zahlen=new int[n]; for(int i=0;i<n;i++) zahlen[i]=(rand()%n)+1; } };Lg caro
-
fischldi schrieb:
Hallo !
Ich habe eine Klasse (-> Zahlenliste) und ein private Datenelement zahlen vom STL Typ vector<int>.
Nun soll ich einen Konstruktor mit einem int Parameter für die Anzahl der enthaltenen Zahlen (die Liste soll n Elemente haben , die je eine zufällige Zahl sind) erstellen.
Kann ich mit meinem vector , der zahlen heisst, so umgehen wie mit einem Array?Oder warum gibt mein Code hier einen Fehler?
#include<iostream> #include<vector> #include<algorithm> using namespace std; class Zahlenliste{ private: vector<int> zahlen; public: Zahlenliste(int n):zahlen(n){ zahlen=new int[n]; for(int i=0;i<n;i++) zahlen[i]=(rand()%n)+1; } };Lg caro
die Zeile
zahlen=new int[n];ist unnötig. Ein Vector ist dynamisch und du musst die Größe nicht angeben
-
Bei einem Container sollte man versuchen, die Methoden des Containers zu benutzen, um Elemente zu verändern. Ein vector<> ist ja schließlich ein Objekt.
Schau mal hier:
http://www.cppreference.com/wiki/stl/vector/startDa findest du alle Methoden und Beispiele zur Benutzung.
-
-
Danke für den Tipp!Ist es sinnvoll einen Itterator zu verwenden der meine liste füllt?
-
Kommt darauf an. Was hast du vor? Btw: Am Besten niemals den std-Namensraum auflösen und zahlen kann in diesem Falle auch const sein...
-
#include<iostream> #include<vector> #include<algorithm> using namespace std; class Zahlenliste{ private: vector<int> zahlen; vector<int>::iterator it; public: Zahlenliste(int n):zahlen(n){ for(it=zahlen.begin();it<zahlen.end();it++) zahlen,push_back((rand()%n)); } };Ich habe das jetzt so gemacht...macht man das so?

-
Kóyaánasqatsi schrieb:
Btw: Am Besten niemals den std-Namensraum auflösen
- Niemals in Headern
- Gilt das nicht nur für std sondern für jeden Namensraum!
@fischldi:
In dem Fall ist das unnötige CPU-Zeit, die du da verbrätst.
In der Initialisierungsliste füllst du deinen vector mit (defaultkonstruierten) Werten. Im Konstruktorbody weist du denen dann nochmal neue Werte zu.Es wäre besser, wenn du deinem Vector genügend Speicher gibst und dann einfach mit push_back arbeitest:
ZahleListe::ZahlenListe( size_t size ) { zahlen.reserve(size); // verhindert unnötiges Kopieren, da der vector // falls er zu klein ist sich selbstständig vergrößert for( size_t i = 0; i < size; i++ ) { zahlen.push_back((rand()%size)); } }
-
Nein. Zum ersten, lass die using-direktive aus dem header raus. Siehe FAQ-Eintrag dazu.
Zweitens, wenn du den vector mit (n) initalisierst, legst du bereits n elemente an (default-kosnturiert, also mit 0). durchs push_back schiebst du dann nochmal n elemente hinten dran. Das ist wohl kaum das was du willst. Außerdem benutzt du den iterator garnicht, also ist die Schleife auch murks. Davon abgesehn sollte der Iterator wenn dann lokal in der Schleife benutzt werden. Lies dir dringend nochmal ein paar Tutroials durch, das sieht nicht so aus als wüsstest du Bescheid was du da tust, sondern als ob du nur blind herumprobierst, und das bringt garnichts.Folgene Möglichkeiten:
#include<vector> #include <cstdlib> // for 'rand()' class Zahlenliste { private: vector<int> zahlen; public: Zahlenliste(int n) : zahlen(n) //Groesse vorbelegt { for(int i = 0; i < n; ++i) zahlen[i] = rand() % n; //vorinitialisierte Elemente aendern } };#include<vector> #include <cstdlib> // for 'rand()' class Zahlenliste { private: vector<int> zahlen; public: Zahlenliste(int n) : zahlen() //leerer vector { for(int i = 0; i < n; ++i) zahlen.push_back(rand()%n); } };
-
Vielen Dank für Eure Hilfe!!!