Zugriff auf Element eines mehrdimensionalen std::vectors



  • Hey,
    ich habe folgendes Konstruct

    std::vector<int>*** x;
    x= new std::vector<int>**[DimX];
    for (int i=0; i<DimX; i++)
     {
       x[i] = new std::vector<int>*[DimY];
       for (int j=0; j<DimY; j++)
       {
         x[i][j] = new std::vector<int>[DimZ];
       }
    }
    

    Und ich lade in dieses "Vektorfeld" über

    x[i][j][k].push_back(value);
    

    Werte rein.

    Jetzt würde ich gerne diese Werte auch wieder auslesen, wenn ich aber nun versuche mit einem weiteren Index auf die Werte zuzugreifen bekomme ich einen Null-Pointer (was ja fast logisch ist, denn die vierte Komponente gibt es ja nicht). Gibt es noch eine andere möglichkeit, als über pop_back() an die Daten zu kommen?



  • Was zum? Klar geht das. vec[i][j][k][l], fertig. Aber du kennst vector schon und machst trotzdem solchen Quatsch? Warum nicht

    vector<vector<vector<vector<int>>>> v;
    

    Wobei mir 4 Dimensionen auf schlechte / nicht vorhandene Kapselung hinzuweisen scheinen.



  • @maddy87: Warst du mal Koch? 😉



  • Aber der erste April ist doch schon vorbei, maddy87!

    👍 für cooky451s Beitrag.



  • Ich war weder mal Koch noch ist dies ein erster April Scherz. Ich benötige diese Aufteilung da ich ein 3d-Bild durchgehen muss und zu jedem Punkt 0->n Werte speichern muss (die ersten 3 Vektoren repräsntieren also das Bild und in den letzten schreibe ich die Werte rein).

    Ich habe es jetzt mal mit

    std::vector<int>::iterator it = x[i][j][k].begin();
    

    Versucht und zähle dann in einer for schleife den Iterator hoch mit

    it++
    

    Den Wert den der Iterator an der Stelle hat auf die er gerade zeigt versuche ich mit

    *it
    

    auszulesen, doch irgendwie scheint dies nicht zu gehen.



  • maddy87 schrieb:

    Ich war weder mal Koch

    Na gut, hätte ja sein können, weil du versuchst, möglichst viele Sterne zu haben. 😉

    maddy87 schrieb:

    Ich benötige diese Aufteilung da ich ein 3d-Bild durchgehen muss und zu jedem Punkt 0->n Werte speichern muss (die ersten 3 Vektoren repräsntieren also das Bild und in den letzten schreibe ich die Werte rein).

    Benötigt dein 3D-Bild tatsächlich drei Dimensionen, oder hast du nur zu jedem Pixel noch eine Tiefeninformation (Kinect etc.)?
    Vielleicht kannst du ja mal genauer erklären, was du eigentlich vor hast (wenn du deine auf mich recht verdächtige Problemlösung auf höhere Ebene verbessern willst), oder ein kompilierbares Minimalbeispiel zu deinem jetzigen Problem mit dem Iterator posten (wenn du dein aktuelles kurzfristiges Problem einfach nur weg haben willst, damit es irgendwie läuft).



  • cooky451 hat dich auch schon auf die fehlende kaspelung angesprochen. man könnte es, grob gesagt, so machen:

    class Picture
    {
      public:
        ...
        // hier halt dein konstructor, etc.
        int get(int x, int y); 
      private:
        std::vector<int> picture_m; // oder std::array, kommt halt drauf an, ob das bild ne fixe größe hat
        int x, y; // größe des bildes
        ...
    };
    

    so hier hast du dein bild. die daten sind alle hintereinander gespeichert, und du musst in deiner get-funktion dann halt den zugriff auf den vector richtig machen. hier ein kleines beispiel:

    Größe des Bildes: 3 * 3
    => vector hat größe 9 (oder array)
    ++++++++++++++++++++++++++++
    |00|01|02|10|11|12|20|21|23|
    ++++++++++++++++++++++++++++
    Die erste ziffer steht für die reihe, die zweite für die spalte.
    wenn du jetzt z.b. auf 12 zugreiffen willst. musst du etwas rechnen, aber das überlasse ich jetzt mal dir ;)
    

Anmelden zum Antworten