Referenzen von Arrays



  • 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. Ein vector<int> ist ein Vektor für int-Objekte). Natürlich kann man sowas auch verschachteln, d.h. ein vector< 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
    Mit

    void 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.



  • Also, nur damit ich es richtig verstehe:

    int a;
    
    test(&a);
    
    void test(int b){
      b=30;
    }
    

    Würde hier jetzt a auf die 30 zeigen?





  • Ahh,ein SEHR gutes tutorial 🙂
    Danke 😃



  • Hallo zusammen,

    ich quäle mich auch seit einer Weile durch die Vektor Klasse. Leider findet man im Netz nur wenig zu der hier angesprochenen Form einer Matrix.
    Ich stelle mir schon seit geraumer Zeit die Fragen:
    Wie wirken die Methoden size und resize auf die Matrix? Gibt size wirklich die Größe der Matrix zurück oder die der ersten Dimension?
    Beispiel:
    vector<vector<double>> vvdAuto;
    // jetzt sollte der Wert von auto NULL sein, oder?
    vvdAuto.resize(2); // wird nun die erste Dimension auf 2 Elemente gesetzt?
    // wenn ich nun ein Paar Werte in meine Matrix eintrage, also z.B.
    vvdAuto[0].push_back(3.2);
    vvdAuto[0].push_back(3.7);
    vvdAuto[1].push_back(4.8);
    // Auslesen der Größe der Matrix:
    vvd.Auto.size(); // was wäre das Ergebnis??
    // Ist es korrekt, dass vvdAuto[0][0] = 3.2 und vvdAuto[0][1] = 3.7 und vvdAuto[1][0] = 4.8 ???

    Danke schonmal vorab für alle hilfreichen Kommentare.
    Grüße Fritz



  • Fritz_98 schrieb:

    Hallo zusammen,
    Gibt size wirklich die Größe der Matrix zurück oder die der ersten Dimension?

    letzteres.

    Beispiel:
    vector<vector<double>> vvdAuto;

    hier beim schließen der "template-klammern" bitte ein leerzeichen einbauen, damit der parser das nicht mit dem operator>> verwechselt.

    // jetzt sollte der Wert von auto NULL sein, oder?

    Nein. Du hast einen vector von vectoren von doubles, der hat nicht einfach irgendeinen Zahlenwert NULL. Mit der Deklaration fabrizierst du einen (leeren) vector, der double-vectoren aufnehmen kann.

    vvdAuto.resize(2); // wird nun die erste Dimension auf 2 Elemente gesetzt?

    genau das. Du hast jetzt einen vector, der zwei (leere) double-vectoren beinhaltet,

    // wenn ich nun ein Paar Werte in meine Matrix eintrage, also z.B.
    vvdAuto[0].push_back(3.2);
    vvdAuto[0].push_back(3.7);
    vvdAuto[1].push_back(4.8);
    // Auslesen der Größe der Matrix:
    vvd.Auto.size();

    Ich nehme mal an, dass der Punkt zwischen vvd und Auto ein Tippfehler ist. Da du mit vvdAuto den äußeren vector bezeichnest, gibt dir size() immernoch 2 zurück (du hast es oben ja mit resize() auf 2 gesetzt). Um die größen der inneren vectoren zu wissen, musst du sowas aufrufen:

    vvdAuto[0].size(); //gibt hier 2
    vvdAuto[1].size(); //gibt hier 1
    

    // was wäre das Ergebnis??
    // Ist es korrekt, dass vvdAuto[0][0] = 3.2 und vvdAuto[0][1] = 3.7 und vvdAuto[1][0] = 4.8 ???

    ja, ist korrekt

    Danke schonmal vorab für alle hilfreichen Kommentare.
    Grüße Fritz



  • danke pumuckl, deine Antworten haben mir echt sehr geholfen.
    Habe jetzt das Gefühl einigermaßen durchzusteigen.
    Aber eine letzte Frage bleibt:
    Wenn ich nur meine Matrix vvdAuto deklariere und sonst noch nichts mache, dann ist mein Vektor vom Vektor leer.
    Könnte man dann schon vvdAuto.size() anwenden? Wäre der Wert dann NULL?

    Danke für die Bemühungen --> hat echt schon etwas gebracht 😃


Anmelden zum Antworten