Dynamisch 2 Dimensionales Array erstellen



  • Hallo,
    ich habe eine kleine Verständnisfrage zu dem oben genannten Thema.

    int** matrix;
    

    hier wird ein zeiger auf einen Zeiger erstellt.

    matrix = new int* [zeile];
    

    matrix zeigt nun auf das erste von zeile Elementen eines neu angelegtenZeiger Arrays.

    for(int i = 0; i < zeile; i++) {
       matrix[i] = new int [spalte];
    }
    

    der i. Zeiger zeigt nun auf das erste von spalte Elementen eines neu angelegten int arrays.

    Ist das soweit richtig?

    Max



  • Ja.



  • Du hat die FAQ nicht gelesen. Das Ja vom Vorposter hast du nicht verdient. 😡



  • Max123, haste schon mal etwas von Kapselung gehört?

    template<typename T>
    class matrix
    {
      std::vector<T> elemente;
      size_t zeilen, spalten;
    
      size_t index(size_t z, size_t s)
      { [...] }
    
    public:
      matrix() : zeilen(0), spalten(0) {}
      matrix(size_t z, size_t s) : [...]
      [...]
      T      & operator()(size_t z, size_t s)       {return elemente[index(z,s)];}
      T const& operator()(size_t z, size_t s) const {return elemente[index(z,s)];}
      [...]
    };
    

    Beachte: Benutzung von new/delete ist hier nicht nötig.

    Gruß,
    SP



  • Nur als Zusatz: Eindimensional klappt aber nicht (gut), wenn verschiedene Zeilen eine unterschiedliche Spaltenanzahl haben können.



  • was hätte mir das FAQ gebracht? Da steht nur u.a. die von mir gepostete Lösung. Ich bin grad am lernen und in meinem Buch wurde diese Verwendet und ich wollte nur wissen, ob ich das ganze richtig verstanden habe.



  • Die Lösung mit Zeilenzeigervektor und separatem Speicherbereich ist ok, um zu lernen, wie man mit Pointern arbeitet und wie das in C geht (dann mit malloc statt new). In C++ würde ich immer zu einem

    std::vector< std::vector<T> >
    

    raten. Das ist weniger fehleranfällig. Klappt für Dimensionen beliebiger Größe und bietet ebenfalls die Index-Syntax, wie man sie von C kennt:

    std::vector< std::vector<int> > a;
    a.resize(numLines);
    for (int i = 0; i < numLines; ++i )
    {
        a[i].resize(numColumns);
    }
    a[0][0] = 42;
    

Anmelden zum Antworten