zweidimensionaler Vektor



  • wie ich herausgefunden habe, müßte man mit

    vector<vector<string> > Koordinatensystem(10);
    

    einen 2d-Vektor erzeugen können, z.B. für ein Koordinatensystem.

    Wollte mich dann näher informieren, z.B. bei http://www.cplusplus.com/reference/stl/vector/vector/, unter anderem wie man Reihen und Spalten auseinanderhält bzw. konkreten Schnittpunkten Werte zuweist, aber habe dort nichts gefunden.

    Kann mir jemand einen Tip geben, wo ich mich online schlaulesen könnte?



  • vector< vector<> > ist kein spezieller 3D container und beitet deshalb auch keine speziellen operationen an.

    auf die zeilen/spalten kannst du per vec[] zugreifen und auf einen punkt per vec[][] (das kannst du beliebig tief schachteln)


  • Mod

    Ich hoffe mal, dass du zumindest mit den Grundlagen des einfachen Vectors vetraut bist (ansonsten solltest du das erst einmal ändern!).

    Du hast hier einfach Zwei Vectoren verschachtelt. Das heißt mit deinem Aufruf
    vector<vector<string> > Koordinatensystem(10);
    hast du 10 vector<string> erzeugt. Diese Vectoren sind aber noch allesamt leer! Du musst ihnen erst noch Elemente zuweisen (z.B. mit push_back oder resize). Oder, falls du ein rechteckiges Koordinatensystem möchtest, kannst du auch das zweite Argument des Vectorkonstruktors benutzen, dann haben die Reihen/Spalten (was du wie nennst ist deine Sache) am Anfang alle die gleiche Länge (da es Vectoren sind, kannst du sie natürlich nachträglich trotzdem ändern), z.B. so für ein 10*20 Feld:
    vector<vector<string> > Koordinatensystem(10, vector<string>(20));

    Zum Zugriff ist das auch streng logisch: Dein Koordinatensystem ist ein Vector von Vectoren. Das heißt, wenn du auf eines der Elemente zugreifst, z.B. Koordinatensystem[5] , dann erhältst du einen vector<string> . Und da kannst du dann auch auf die Unterelemente zugreifen, indem du einfach noch einen Zugriffsoperator dranhängst: Koordinatensystem[5][3]



  • Danke soweit. Mir ist eingefallen, daß man ja auch mal auf englischen Seiten suchen könnte und bin da auch prompt fündig geworden:
    Eine Matrix 10*10 mit Ausgabe könnte dann wohl so aussehen:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    vector<int> Spalten(10,0); // 10 Spalten mit Wert 0
    vector< vector<int> > Reihen(10, Spalten); //10 Reihen 
    vector< vector < vector<int> > > g(1, Reihen); // "Behälter" für beide Vektoren
    
    vector<int>::const_iterator s;
    vector< vector<int> >::const_iterator r;
    vector< vector < vector<int> > >::const_iterator d;
    
    for (d = g.begin(); d != g.end(); d++)
    {
       for(r = (*d).begin(); r != (*d).end(); r++)
       {
         for (s = (*r).begin(); s != (*r).end(); s++)
          {
           cout << (*s) << " ";
          }
    
        cout << endl;
       }
    }
    return 0;
    }
    


  • mal grad so nebenbei für mein verständnis:

    bei dem teil:

    // ...
    for (d = g.begin(); d != g.end(); d++)
    {
       for(r = (*d).begin(); r != (*d).end(); r++)
       {
         for (s = (*r).begin(); s != (*r).end(); s++)
          {
           cout << (*s) << " ";
          }
    
        cout << endl;
       }
    }
    

    könnte man da auch das schlüsselwort auto benutzen?

    for (auto d = g.begin(); d != g.end(); d++)
    {
       for(auto r = (*d).begin(); r != (*d).end(); r++)
       {
         for (auto s = (*r).begin(); s != (*r).end(); s++)
          {
           cout << (*s) << " ";
          }
    
        cout << endl;
       }
    }
    

  • Mod

    redrew99 schrieb:

    Danke soweit. Mir ist eingefallen, daß man ja auch mal auf englischen Seiten suchen könnte und bin da auch prompt fündig geworden:
    Eine Matrix 10*10 mit Ausgabe könnte dann wohl so aussehen:

    Kannst du erklären, wozu noch der dritte Vector drumherum soll? Außerdem: guck dir mal an, was der Operator -> macht.

    @seldon: Ja, das sollte so gehen. Natürlich nur mit einem Compiler der den 2011er Standard umsetzt.



  • SeppJ schrieb:

    Kannst du erklären, wozu noch der dritte Vector drumherum soll?

    Nicht wirklich. Hatte mich das auch gefragt, aber eine eigene Version mit 2 Vektoren
    nebst Ausgabe hat nicht funktioniert, deswegen habe ich das erstmal so gelassen.
    Ist aber einfach nur überflüssig. (s. unten)

    SeppJ schrieb:

    Außerdem: guck dir mal an, was der Operator -> macht.

    Dachte, das ein Rückschluss auf Zeiger mit "()." nachvollziehbarer ist als "->". (Weil Zeiger ja normalerweise mit "" dargestellt werden.)
    Hier dann nochmal der korrigierte Code:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
     vector<int> Spalten(10,0); // 10 Spalten mit Wert 0
     vector< vector<int> > Reihen(10, Spalten); //10 Reihen
    
     vector<int>::const_iterator s;     //Ausgabe der Tabelle
     vector<vector<int> >::const_iterator r;
    
     for (r = Reihen.begin(); r != Reihen.end(); ++r)
      {
        for(s = r->begin(); s != r->end(); ++s)
         {
            cout << *s << " ";
         }
       cout << endl;
      }
     return 0;
    }
    

Anmelden zum Antworten