2d array (vector*vector) schnell initialisieren


  • Mod

    evaluate{ func(bla)... }; ist AFAIK kein initializer-clause.

    evaluate{ func(bla)... } ist selbstverständlich keine initializer-clause, jedenfalls nicht ohne Kontext.
    Aber func(bla)... sind welche. Und zwar für die initializer list mit der die Temporary initialisiert wird.



  • Arcoth schrieb:

    evaluate{ func(bla)... }; ist AFAIK kein initializer-clause.

    evaluate{ func(bla)... } ist selbstverständlich keine initializer-clause, jedenfalls nicht ohne Kontext.
    Aber func(bla)... sind welche. Und zwar für die initializer list mit der die Temporary initialisiert wird.

    Dann hält sich GCC scheinbar nicht daran.
    http://ideone.com/ueQiBN


  • Mod

    Nathan schrieb:

    Dann hält sich GCC scheinbar nicht daran.
    http://ideone.com/ueQiBN

    Ja, das ist ein längst gemeldeter Bug.



  • Arcoth schrieb:

    Nathan schrieb:

    Dann hält sich GCC scheinbar nicht daran.
    http://ideone.com/ueQiBN

    Ja, das ist ein längst gemeldeter Bug.

    Gut zu wissen.
    So lange nutze ich halt char-Arrays.



  • Hm, hätte mir wohl denken können dass das wieder mal nicht so leicht ist wie anfangs gedacht 😃

    Aber dieses N4228 proposal liest sich ja schonmal interessant, danke für den Link. Vielleicht wirds ja dann in C++17 mal was mit matrix[i, j] .



  • happystudent schrieb:

    Vielleicht wirds ja dann in C++17 mal was mit matrix[i, j] .

    Nein, wieso sollte es?
    Das bricht existierenden Code. Und der meiste C+++ Code ist schon geschrieben, die Sprache ist alt und etabliert. Man kann es sich nicht mehr leisten, Code zu brechen.



  • happystudent schrieb:

    Hm, hätte mir wohl denken können dass das wieder mal nicht so leicht ist wie anfangs gedacht 😃

    Aber dieses N4228 proposal liest sich ja schonmal interessant, danke für den Link. Vielleicht wirds ja dann in C++17 mal was mit matrix[i, j] .

    Ok, nach Proxy googlen war zu schwer.

    http://www.c-plusplus.net/forum/57613-full
    http://www.c-plusplus.net/forum/321185-full
    http://www.c-plusplus.net/forum/113709-full



  • Nathan schrieb:

    Nein, wieso sollte es?
    Das bricht existierenden Code. Und der meiste C+++ Code ist schon geschrieben, die Sprache ist alt und etabliert. Man kann es sich nicht mehr leisten, Code zu brechen.

    Es müsste nicht zwingend alten Code brechen. Man könnte es auch so machen dass alter Code bestehen bleibt und nur im Falle eines überladenen operator[](int, ...) die Indizierung anders interpretiert wird:

    struct alter_code {
        int value;
        int &operator[](int i) { return value; }
    };
    
    struct neuer_code {
        int value;
        int &operator[](int i, int j) { return value; }
    };
    
    int main() {
        alter_code ac;
        neuer_code nc;
    
        ac[0, 0] = 1; // operator[](int), da kein operator[] mit mehr als 1 argument überladen
        nc[0, 0] = 2; // operator[](int, int), da operator[] mit > 1 argument vorhanden
    }
    

    Dadurch würde nichts brechen, da alter Code ja keinen operator[] mit mehr als einem überladenen Argument enthalten kann.

    Edit:

    volkard schrieb:

    Ok, nach Proxy googlen war zu schwer.

    http://www.c-plusplus.net/forum/57613-full
    http://www.c-plusplus.net/forum/321185-full
    http://www.c-plusplus.net/forum/113709-full

    Nein, wie bereits (mehrmals) geschrieben geht es um eine indizierung per matrix[i, j] und nicht um eine proxy addressierung mittels matrix[i][j] , da das ja dann keine matrix struktur darstellt sondern eher was wie vector<vector<T>> .



  • happystudent schrieb:

    Nein, wie bereits (mehrmals) geschrieben geht es um eine indizierung per matrix[i, j] und nicht um eine proxy addressierung mittels matrix[i][j] , da das ja dann keine matrix struktur darstellt sondern eher was wie vector<vector<T>> .

    Hab jetzt nicht alles gelesen, aber warum nicht matrix(i, j)? Ist evtl. noch schöner als matrix[i][j].



  • happystudent schrieb:

    Nein, wie bereits (mehrmals) geschrieben geht es um eine indizierung per matrix[i, j] und nicht um eine proxy addressierung mittels matrix[i][j] , da das ja dann keine matrix struktur darstellt sondern eher was wie vector<vector<T>> .



  • Mechanics schrieb:

    happystudent schrieb:

    Nein, wie bereits (mehrmals) geschrieben geht es um eine indizierung per matrix[i, j] und nicht um eine proxy addressierung mittels matrix[i][j] , da das ja dann keine matrix struktur darstellt sondern eher was wie vector<vector<T>> .

    Hab jetzt nicht alles gelesen, aber warum nicht matrix(i, j)? Ist evtl. noch schöner als matrix[i][j].

    Weils kein Funktor/Funktion/Lamda ist, sondern ein 2D-Array.
    Also nicht arr(3,4), sondern arr.at(3,4) oder arr[3][4].



  • volkard schrieb:

    Du sagst es, man meint eine Matrix. Hat aber (im allgemeinen) ein array aus arrays und kann eine tatsächliche Matrix indizierungstechnisch nicht von einem array aus arrays unterscheiden, wobei die einzelnen unter-arrays ja auch unterschiedliche Längen haben können (was dem Prinzip einer Matrix wiederspricht).

    Und darauf wird ja gerade in diesem Forum immer viel Wert gelegt.



  • happystudent schrieb:

    Und darauf wird ja gerade in diesem Forum immer viel Wert gelegt.

    Keine Ahnung, warum SeppJ da (,) vorschlug. Globalmoderatoren dürfen aber auch mal Drogen nehmen. 😃
    Naja, in alten C++-Büchern wurde oft mal (,) auf 2D-Arrays vorgemacht, um ein Beispiel für Operatorenüberladung zu haben.
    Sieh einfach [][] als die C++-Syntax dafür an.



  • Ok, auf jeden Fall wieder eine sehr interessante Diskussion 🙂



  • happystudent schrieb:

    Ja dieser blöde Komma-Operator 👎
    Verwendet den überhaupt jemand außerhalb von for-Schleifen etc.?

    Bei eigenen Containern finde ich den ja auch ganz schick (vgl. boost::assign / eigen v3).



  • SeppJ schrieb:

    Da du nicht der einzige bist, der in letzter Zeit eine falsche Vorstellung von 2D-Arrays hat:
    http://www.c-plusplus.net/forum/p2422591#2422591

    Wenn du einer der dort vorgeschlagene Möglichkeiten benutzt (die letzte der drei scheint die passende zu sein), beschränkt sich das Nullen auf ein einzelnes fill. Und die ganze Struktur ist bei jeder Art von Zugriff wesentlich schneller als vector<vector>. Wieso muss das Feld eigentlich immer wieder neu mit Nullen überschrieben werden? Was hast du vor?

    Wie kann man in deiner vorgschlagenen Klasse IntArray2D eine public Methode mit aufnehmen, die das Array sehr schnell initialisiert, z.B mit Nullen?

    ich dachte an sowas in der Art:

    class IntArray2D 
    { 
      vector<int> data; 
      size_t length_y; 
    public: 
    
      void clr(void)
    {
      this->clear_vector();
    }
      IntArray2D(size_t length_x, size_t length_y): data(length_x * length_y), length_y(length_y) { } 
      int& get(size_t x_coord, y_coord) { return data[x_coord * length_y + y_coord];} 
      void clear_vector(void)
    {
       memset(&data,0x0,sizeof(data));
    }
    
    };
    


  • std::fill(data.begin(), data.end(), 0); ?


Anmelden zum Antworten