3-dimensionales dynamisches Array ?



  • Hi,
    Kann mir jemand sagen, wie ich ein dynamisches Array mit 3 Dimensionen anlege ?
    Ich habe bereits in der FAQ geschaut, aber das hat mir nicht wirklich geholfen, denn die Größen der einzelnen Dimensionen sollen erst zur Laufzeit festgelegt werden, in etwa so:

    int a,b,c;
          cin >> a; cin >> b; cin >> c;
          // lege array[a][b][c] an
    

    Allerdings sollte das Array global zugänglich sein und nicht erst innerhalb einer Funktion angelegt werden, sonst müsste ich es ja immer als Parameter mitschleppen...
    Danke für die Hilfe..
    MfG



  • Schau noch mal in die FAQ. Da gibts nen Artikel für 2-dim Arrays. Lies den,
    verteh den, dann kannst du das gleiche auch in drei Dimensionen machen.

    Schon mal zu Anregung

    vector<vector<vector<int> > > DreiDimArray; // auf die Lücken zwichen den > achten
    


  • Und du bist dir sicher das du das schon gelesen hast?

    Warum soll es global verfügbar sein? das ist oft nicht hübsch.
    Lege einfach einen globalen pointer auf diese array an.

    Gruß Mirauder_Mo



  • Entweder du nimmst einen globalen Pointer und weist ihm dann die Dimensionen zu, ungefähr so:

    int **foo;
    foo = new int*[5];
    for (int i = 0; i < 5; ++i)
    {
      foo[i] = new int[5];
    }
    

    oder aber du nimmst std::vector, das ist sicherer

    #include <vector>
    
    std::vector< std::vector<int> > bar;
    

    Ansonsten sollte auch was in der FAQ stehen..

    [Nachtrag]
    Mist, zu spät 😕



  • die frage passt hier grad so schön:
    ihr habt hier grad dynamische arrays mit vektoren erstellt, ich wollte mal fragen, wann sich das denn lohnt?
    sind Vectoren so schnell, dass sie sich sozusagen immer da auszahlen, wo arrays dynamisch sein sollen, oder gibts da auch fälle, bei denen es wie mit kanonen auf spatzen schießen ist?



  • Danke schön 🙂

    Also ich hab das jetzt so gemacht:

    int a,b,c;  // dann z.B. werte einlesen 
    vector< vector< vector<int> > > array;
    array.resize(a);
    
    for (int i=0; i<a; ++j)
        array[i].resize(b);
    
    for (i=0; i<a; ++i)
       for (int j=0; j<b; ++j)
           array[i][j].resize(c);
    

    Funktionieren tut es 🙂 geht es auch eleganter ?
    Danke nochmal



  • Kann man sich die eine Schleife nicht sparen?

    int a,b,c;  // dann z.B. werte einlesen
    vector< vector< vector<int> > > array;
    array.resize(a);
    
    for (int i=0; i<a; ++i){
       array[i].resize(b);
       for (int j=0; j<b; ++j)
           array[i][j].resize(c);
    }
    

    Gruß
    Entyl Sa



  • otze schrieb:

    die frage passt hier grad so schön:
    ihr habt hier grad dynamische arrays mit vektoren erstellt, ich wollte mal fragen, wann sich das denn lohnt?
    sind Vectoren so schnell, dass sie sich sozusagen immer da auszahlen, wo arrays dynamisch sein sollen, oder gibts da auch fälle, bei denen es wie mit kanonen auf spatzen schießen ist?

    Wenn du dynamische Arrays brauchst, sind Vektoren IMO ganz bestimmt eine gute Wahl.



  • otze schrieb:

    ihr habt hier grad dynamische arrays mit vektoren erstellt, ich wollte mal fragen, wann sich das denn lohnt?

    Ich würde andersrum fragen, wann lohnt es sich denn, etwas anderes als vector zu verwenden? new[]/delete[] (wenn das die Alternative sein soll) ist doch wesentlich umständlicher zu bedienen, damit viel gefährlicher und hat keine normalerweise relevanten Performancevorteile.



  • Zu dyn. Arrays stehen normalerweise Listen in Konkurenz. Welches nun geeigneter
    ist, hängt dann aber natürlich vom Verwendungszweck ab.



  • Im gegebenen Fall, dass ein Array a[xDim][yDim][zDim] simuliert werden soll, wäre eine näher liegende Alternative wohl ein nicht-verschachtelter vector<> der Größe xDim*yDim*zDim. a[x][y][z] wäre dann a[z * xDim * yDim + y * xDim + x]. Damit würde man sich einen Haufen Overhead und Arbeit beim Aufbauen des Arrays sparen, dafür wäre der Zugriff komplizierter und vielleicht langsamer.


Anmelden zum Antworten