std::array zwei- und mehrdimensional



  • Hallo,

    ich komm hier nicht recht weiter, finde aber irgendwie keine Quellen für obige Frage. Kann mir vielleicht jemand ein Beispiel zeigen, wie man mehrdimensionale bzw für zweidimensionale wäre ich schon dankbar, arrays deklariert?

    Falls die Frage eine berühmte lmgfy ist, würde ich für entsprechende Links dankbar sein 😉


  • Mod

    Du machst ein Array von Arrays. Reicht das als Tipp?



  • Nicht wirklich 😉

    std::array <int, 3> arr;
    

    Wie mache ich dann zusätzliche Dimensionen? Ich hatte gehofft, dies würde intuitiver sein als die entsprechenden vector-Konstruktionen.



  • Statt int nimmst du ein array.



  • Also

    std::array <<std::array <int, 3>, 3> arr;
    

    ?


  • Mod

    Jupp. Höhere Dimensionen kannst du dir dann selber denken, oder?

    PS: Denk auch dran, dass es typedef gibt, falls du jetzt denkst, dass das viel zu schreiben und/oder unübersichtlich ist.



  • Uh danke, könntest Du mir schnell die Syntax eines typedef zeigen, wenn ich gerade hier bin?

    Und, falls das durch typedef nicht überflüssig wird, wie man in meinen obigen Beispiel auf ein Element zugreift?


  • Mod

    Na, typedef halt. Kennst du, oder? Wenn nicht, dann guck es nach. Es ist nichts besonderes dran, bloß weil man hier mit std::array arbeitet. Also so oder ähnlich:

    typedef std::array<<std::array<int,3>,3> int3x3;
    int3x3 arr;
    

    Ebenso Zugriff: Es gibt hier nichts besonderes, bloß weil man mit std::array arbeitet. Weißt du wie man auf ein std::array<int, 3> zugreift?

    std::array<int, 3> arr;
    arr[2];  // Ein int.
    

    Dann ist das mit verschachtelten Arrays genau so:

    std::array<<std::array<int,3>,3> arr;
    arr[2];  // Ein std::array<int,3>.
    // Und somit:
    arr[2][1];   // Ein int.
    


  • Prima, vielen Dank, das hilft mir wirklich schon weiter 🙂

    Und nein, typedef kannte ich noch nicht. Ist schon interessant 😉

    EDIT: Ich habe in einigen Codes noch die C-Dinger arr[][] stehen, und ich wollte die halt ersetzen. Mit Eurer Hilfe hier wird mir das nun wohl möglich sein ...


  • Mod

    Oder man macht es sich noch leichter:

    #include <array>
    #include <type_traits>
    
    template <typename T, std::size_t d, std::size_t... ds>
    struct multi_array {using type = std::array<typename multi_array<T, ds...>::type, d>;};
    template <typename T, std::size_t d>
    struct multi_array<T,d> {using type = std::array<T, d>;};
    
    template <typename T, std::size_t... ds>
    using multi_array_t = typename multi_array<T, ds...>::type;
    
    int main() {
    	static_assert( std::is_same<multi_array_t<int, 3,4,2>,
    	               std::array<std::array<std::array<int, 2>, 4>, 3>>{}, "" );
    }
    


  • EDIT: erledigt. Wieder nicht richtig hingeschaut ...

    Die korrekte Syntax lautet wohl

    std::array <std::array <int, 80>, 40> arr;
    


  • Habe aber trotzdem noch Schwierigkeiten

    const int Width = 80, Height = 24;
    
        std::array <std::array <int, Width>, Height> arr;
    
        for (int i=0; i<Width; i++)
        {
            for (int j=0; j<Height; j++)
            {
                arr[i][j] = 5;
            }
        }
        std::cout << arr[3][3];
    

    Bekomme zwar keine Fehlermeldung, Beispiel stürzt aber ab std::cout ab, als ob es eine Zugriffsverletzung geben würde. Was kann denn da falsch sein?



  • arr entspricht int[24][80] , nicht int[80][24] .



  • Danke. Wenn ich die Ausgabe also so haben will, wie ich es meine, muss ich das Height-array "innerhalb" des Width-array deklarieren. Also

    const int Width = 80, Height = 24;
    
        std::array <std::array <int, Height>, Width> arr;
    
        for (int i=0; i<Width; i++)
        {
            for (int j=0; j<Height; j++)
            {
                arr[i][j] = 5;
            }
        }
    

    Eigentlich ja auch logisch 😉


Log in to reply