std::array zwei- und mehrdimensional



  • 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 😉


Anmelden zum Antworten