Referenzen von Arrays
-
oder gleich std::vector nehmen
-
Geht std::vector nicht nur für den eindimensionalen Fall?
-
std::vector< pair<double, double> > d;
-
@pepe-je: Wenn die Grösse erst zur Laufzeit feststeht kann man nicht wirklich Referenzen verwenden, aber man kann einen einfachen Zeiger (T*) auf ein normales Array verwenden:
void foo(double* p, unsigned w, unsigned h) { for (unsigned x = 0; x < w; x++) { for (unsigned y = 0; y < h; y++) { p[y*w+x] = 123; } } } void bar() { unsigned w = ...; unsigned h = ...; double *p = new double[w*h]; foo(p, w, h); delete p; }
-
Der Vorschlag mit
std::vector< pair<double, double> > d;
zu arbeiten, würde gut in mein Programm passen, aber wie kann man d Werte zuweisen?
bei eindimensionalen Vektoren geht es ja mitd.push_back(wert);
Aber wie geht es mit zwei Dimensionen?
-
std::vector< std::vector<int> >
-
Ist die vollständige Deklaration beispielsweise
double vector< double vector<int> x(3) > y(2)??
Wie kann man die Elemente dieses "Doppelvektors" mit Werten belegen und später aufrufen??
-
pepe-je schrieb:
Ist die vollständige Deklaration beispielsweise
double vector< double vector<int> x(3) > y(2)??
Huch? Nein. Wie kommst Du auf 'double vector'?
Ein Vektor ist einfach nur ein generischer Container, der eine Art Array für Objekte eines bestimmten Typs darstellt (ein
vector<T>ist ein Vektor für T-Objekte. Einvector<int>ist ein Vektor für int-Objekte). Natürlich kann man sowas auch verschachteln, d.h. einvector< vector<int> >ist ein Vektor, der Objekte des Typs „Vektor für int-Objekte“ enthält. Also ein Array von Arrays von ints.
-
Nein, du mußt (wie sonst auch) genau eine Variable deklarieren:
const int X = 10; const int Y = 5; vector< vector<double> > array(X); for(size_t i=0; i<array.size(); i++) // Alternativ Iterator verwenden array[i].resize(Y); // Zugriff dann mit array[x][y]Wahlweise kannst du auch einzelne Elemente mit push_back() hinten dran hängen.
-
einfach hinten anhängen, dann wird von selber vergrößert.
std::vector< std::vector<double> > vec(3); vec[0].push_back(0.5); vec[0].push_back(1.5); vec[1].push_back(2.5); vec[2].push_back(3.5);
-
#include <vector> using namespace std; int main() { int m = 3; int n = 5; vector<vector<double> > myarr(m, vector<double>(n)); // Damit wird ein Vektor von drei Vektoren mit jeweils n-(double)Elementen erzeugt. // Die m*n(hier 15 double)-Elemente werden alle mit dem Default-Wert 0.0 initialisiert. // Der Zugriff auf die Elemente erfolgt mit dem doppelten Aufruf des Indexoperators z.B.: myarr[1][3] = 47.11; double test = myarr[1][3]; }
-
Ich habe ich gemacht, wie Hm vorgeschlagen hat. Es klappt einwandfrei, vielen Dank.
Jetzt habe ich noch die Wissenslücke, wie so ein "doppelter Vektor" an eine Funktion übergeben werden kann, welche die Werte ändern soll
Mitvoid function ((vector<vector<double>> &p){}
scheint es nicht zu gehen. Wie kann man die Referenz auf
vector<vector<double> > p(m, vector<double>(n))
in function() formulieren?
-
">>" wird als rechts-shift verstanden und nicht (in diesem Fall) als doppelte schließende Template-Klammer
Also einfach void function ((vector<vector<double> > &p){}.
-
Hallo, vielen Dank an Euch alle, Ihr habt mir sehr geholfen
pepe-je
-
Endlich habe ich das auch mal verstanden, thx ^^
und da ihr so in fahrt gekommen seit habe ich gleich noch 3 Fragen :þ1. Was hat das mit "<" und ">" aufsich?
`-> also, cin muss man ja immer "<<" und cout ">>" aber was bedeutet das dO.0b?2. das mit "&irgendwas" verstehe ich immer noch nicht obwohl ich mir schon zahlreiches reingezogen habe.
3. Wie verbinde ich variablen usw...?
-\> z.B.: In Java kann ich text und variablen usw.. mit "+" verbinden/dranhängen |-> String text = variable +"Irgendwelcher Text" +zahl;
-\> Z.B.: In PHP macht man das mit "."; |-> text = variable."Text".zahl;So wollt keinen neuen Thread erstellen nur weil ich in diesem was nicht verstanden habe (siehe Frage 1 u. 2) und die dritte quält mich schon seit ich heute mit C++ angefangen habe :þ
-
1 siehe operator überladen
2 gibt dir die adresse von irgendwas im spiecher zurück
3 du musst den umweg über stringstreams und << gehen. die c++ler fanden wohl, dass ein string nichts können soll, obwohl man da genauso + überladen hätte können.
-
1. Habe ich mir ja schon angeschaut, versteh aber ned. Könnte man da nicht mal son gutes beispiel machen wie hier mit zeigern?
2. Sagt mir auch nicht viel
3. Ebenfalls
-
2. was sagt dir nichts? Speicher oder Adresse?
-
Nene, ich weis zwar was damit gemeint ist, doch ich kann es mir nicht vorstellen wie das funktionieren soll und in welcher form diese zurückgegeben werden.
z.B.: bei GetMousePos(&pos), was soll das das &pos bewirken? (steht in manchen beispiele die zur ermittlung der Mausposition dienen)
-
Du gibts der Funktion GetMousePos die Adresse der Variable wo die Position hin geschrieben werden soll.
Wenn die pos Variable nicht als Pointer oder Referenz übergeben würde, dann würde GetMousePos nur mit einer Kopie arbeiten und wenn die Funktion beendet wäre, hätte sich nichts in der eigentlichen pos Variable geändert.