Frage

Ich habe einen n-dimensionalen Boost.Multiarray Ich initialisiere wie folgt:

const int n=3, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr;
boost::array<size_t,n> extents; //size of each dimension
extents.assign(size); //assign size to each dimension -> {{4, 4, 4}}
arr.resize(extents);

Ich habe also 4 Codezeilen, um das Multiarray zu erhalten, aber ich würde es gerne in einer Zeile tun. Gibt es eine einfache Möglichkeit, ein Multiarray mit N -Dimensionen zu generieren, die jeweils haben size Länge (damit ich schreiben kann arr(samevaluearray(n,size))) oder habe ich einen praktischen Konstruktor für Multiarray vermisst?

Bearbeiten: Es sollte funktionieren, ohne von einem bestimmten Wert von n, dh abhängig arr({{size,size}} würde nur für arbeiten für n=2.

Da kann es nicht klar sein: boost::multi_array<char,n>(boost::extents[4][4][4]) Initialisiert korrekt ein 4x4x4-Array, aber jedes Mal n wird in der SourceCode geändert, jede Initialisierung muss von Hand aktualisiert werden, sodass sie keine Option ist.

War es hilfreich?

Lösung 2

Es stellt sich heraus, dass std::vector hat einen Konstruktor, der einen Vektor mit einem konstanten Wert erstellt, das n -mal wiederholt ist, sodass eine mögliche Lösung so aussieht:

const int n=2, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr(std::vector<size_t>(n,size));

Dadurch wird ein n-dimensionales Multi_Array initialisiert, wobei die Größe jeder Dimension auf Größe eingestellt ist.

Andere Tipps

Sie können die Erstellung des Arrays in eine Helferfunktion einkapseln:

template <typename T, size_t N>
boost::multi_array<T, N> make_regular_matrix(const size_t m)
{
    boost::multi_array<T, N> arr;
    boost::array<size_t, N> extents;
    extents.assign(m);
    arr.resize(extents);

    return arr;
}

const int n = 3;
int size = 4; // Can be const as well, but this is not mandatory

auto arr = make_regular_matrix<char, n>(size);

Wenn Sie nicht verwenden können auto, Sie müssen die Vorlagenparameter duplizieren:

boost::multi_array<char, n> arr = make_regular_matrix<char, n>(size);

Das make_regular_matrix Die Funktion könnte verkürzt werden, um sie zu verwenden std::vector, wie Sie es in Ihrer Antwort getan haben; Ich weiß nicht, ob diese Implementierung besser wäre. Ziel der Helferfunktion ist es, die Erstellung des Arrays zu verbergen, aber andere Versionen könnten geschrieben werden, um beispielsweise die Array -Elemente mit einem bestimmten Wert zu initialisieren:

template <size_t N, typename T> //switched order for deduction
boost::multi_array<T, N> make_regular_matrix(const size_t m, const T & value)
{
     boost::multi_array<T, N> arr(std::vector<size_t>(n, m));

     std::fill(arr.data(), arr.data() + arr.num_elements(), value);

     return arr;
}

auto arr = make_regular_matrix<4>(3, 'z'); //creates a 3x3x3x3 matrix
                                           //filled with 'z's

Von dem Steigern Sie die Multi-Array-Dokumentation, Ja, Sie können es eine Zeile initialisieren:

typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);

Die Typedefs dienen der Lesbarkeit, man kann genauso einfach für Ihr Beispiel tun:

boost::multi_array<int, 2> arr(boost::extents[2][4]);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top