std::array constand expression



  • Ich programmier gerade eine Übung von codinggame.com und habe ein kleines Problem. Die Übung gibt mir über die Console die Länge und die Breit einer 2D Map an:

    int width; // the number of cells on the X axis
        cin >> width; cin.ignore();
        int height; // the number of cells on the Y axis
        cin >> height; cin.ignore();
    

    Um die Aufgabe zu meistern möchte ich einen array eines arrays erstellen, der mir angibt auf welcher Position ein Node ist:

    std::array< std::array<bool, width>, height > map2d;
    

    Leider verlangt der Array dass width und height constand expressions sind, aber wie soll ich das machen, wenn ich die Größe erst in der Laufzeit erfahre? Gibt es eine möglichkeit std::array trozdem zu verwenden, oder ist er dafür nicht gemacht?



  • Nein, so kann man std::array nicht verwenden. Als Alternative empfehle ich einen std::vector mit Höhe*Breite Elementen und eigener Umrechnung von Koordinaten auf den zugehörigen Index.



  • patrick246 schrieb:

    Nein, so kann man std::array nicht verwenden. Als Alternative empfehle ich einen std::vector mit Höhe*Breite Elementen und eigener Umrechnung von Koordinaten auf den zugehörigen Index.

    Das ist schade, ich dachte std::array wäre das equivalent zum carray, jenes kann man auch zur Laufzeit mit den Größenwerten initialisieren. Die Aufgabe ist für jeden Node den rechten und unteren Nachbar zu finden. Darum muss ich array[x 1, y 1] durchsuchen, ob ein Nachbar existiert.



  • cppv0id schrieb:

    Das ist schade, ich dachte std::array wäre das equivalent zum carray, jenes kann man auch zur Laufzeit mit den Größenwerten initialisieren.

    Nein, kann man nicht. Das ist eine nicht standardkonforme Erweiterung.



  • Nathan schrieb:

    Nein, kann man nicht. Das ist eine nicht standardkonforme Erweiterung.

    Ist tatsächlich Teil des C99 Standard und nennt sich variable-length arrays.



  • sebi707 schrieb:

    Nathan schrieb:

    Nein, kann man nicht. Das ist eine nicht standardkonforme Erweiterung.

    Ist tatsächlich Teil des C99 Standard und nennt sich variable-length arrays.

    Ja, C99, C11 schon nicht mehr (optional) un in C++ waren sie nie.



  • std::vector< std::vector< bool > > map2d( height, std::vector< bool >( width ) );
    

    wäre die Lösung mit vector. Hat sogar noch den netten Nebeneffekt, dass ungefähr nur ein bit pro bool an Speicherverbrauch anfällt.



  • Torsten Robitzki schrieb:

    std::vector< std::vector< bool > > map2d( height, std::vector< bool >( width ) );
    

    wäre die Lösung mit vector. Hat sogar noch den netten Nebeneffekt, dass ungefähr nur ein bit pro bool an Speicherverbrauch anfällt.

    Vorsicht, vector< bool > ist kein Container, das kann probleme machen:

    std::vector< bool > v = {false, false, false};
    bool *b = &v[0]; // Fehler, geht nicht mit vector< bool >
    

Anmelden zum Antworten