Mehrdimensionale Vectoren



  • Irgendwie werd' ich daraus nicht so richtig schlau, wie man std::vectoren so verwenden kann wie man es von mehrdimensionalen Arrays kennt.

    Wenn die Anzahl der Felder bekannt ist, sieht ein statisches 2D-Array doch bekanntermaßen so etwa aus, in dem Fall sollen nur strings verarbeitet werden.

    string s[2][4]
    

    Ich habe also 2 in der ersten und zu jedem dann 4 Werte, die man abrufen kann.
    So ist das noch recht übersichtlich, aber ich kenne die Anzahl ja nicht und würde das dann mit std::vector machen wollen.
    Wie macht man das dann nun?

    Fündig bin ich bisher nur damit geworden, dass man Verschachtelungen baut:

    vector< vector<string> > v2D;
    

    So wird doch aber nur der innere Vector als string gesetzt und der Äußere ist doch nicht wirklich ein string sondern nur ein vector davon, oder wie läuft das?
    Wie kann ich jetzt da meine Werte rein pushen und auch wieder auslesen?

    v2D[0].push_back("irgendwas");
    

    Ist das so richtig?
    Die Themen, die ich hier dazu gefunden habe, haben nicht wirklich weiter geholfen. Es wäre schön, wenn jemand das daufreundlich an einem Beispiel erklären könnte.



  • Du musst da ganz einfach einen vector<string> in die erste Dimension pushen.

    v2D[0].push_back(vector<string>(string("irgendwas")));
    

    Üblicherweise definierst du den vector ausserhalb und füllst ihn zuerst und erst dann fügst du ihn ein.



  • dixidix schrieb:

    Fündig bin ich bisher nur damit geworden, dass man Verschachtelungen baut:

    vector< vector<string> > v2D;
    

    So wird doch aber nur der innere Vector als string gesetzt und der Äußere ist doch nicht wirklich ein string sondern nur ein vector davon, oder wie läuft das?

    Das ist bei Deinem Array genauso. Du hast ein Array aus Arrays von String.

    string s[2][4];
    
    string (&x)[4] = s[1]; // Referenz auf ein "inneres Array"
    x[0] = "hello";
    
    // s[?]    --> string[4]
    // s[?][?] --> string
    
    vector< vector<string> > s (2);
    
    vector<string>& x = s[1]; // Referent auf einen "inneren Vektor"
    x.push_back("hello");
    
    // s[?]    --> vector<string>
    // s[?][?] --> string
    


  • vector< vector< T > > hat ziemlich viel Overhead. Du solltest dir mal boost.multi_array (oder ähnliches) anschauen.


Anmelden zum Antworten