Domanda

Ho una multiarray Boost cui dimensioni sono fissati in fase di esecuzione basato su input dall'utente.

Mi piacerebbe ora come per iterare su tale matrice tramite componenti x,y,z.

Se questo fosse uno std :: vector, vorrei utilizzare:

for(int i=0;i<v.size();i++){

O forse un qualche tipo di iteratore.

Come faccio a ottenere i valori numerici di dimensioni del multiarray?

Come faccio a scorrere i multiarray?

Grazie!

È stato utile?

Soluzione

Si potrebbe utilizzare shape() per un modo meno contorto:

#include <iostream>
#include <string>
#include <boost/multi_array.hpp>

int main() {
    boost::multi_array<std::string, 2> a(boost::extents[3][5]);
    for(size_t x = 0; x < a.shape()[0]; x++) {
        for(size_t y = 0; y < a.shape()[1]; y++) {
            std::ostringstream sstr;
            sstr << "[" << x << ", " << y << "]";
            a[x][y] = sstr.str();
        }
    }
    for(size_t x = 0; x < a.shape()[0]; x++) {
        for(size_t y = 0; y < a.shape()[1]; y++) {
            std::cout << a[x][y] << "\n";
        }
    }
    return 0;
}

(vedere in azione su coliru )

Altri suggerimenti

#include "boost/multi_array.hpp"
#include <iostream>
#include <algorithm>
#include <iterator>

int main () {
    typedef boost::multi_array_types::index_range range;
    typedef boost::multi_array<char, 2> Array2d;
    Array2d a(boost::extents[8][24]);

    //to view the two-dimensional array as a one-dimensional one can use multi_array_ref?
    boost::multi_array_ref<char, 1> a_ref(a.data(), boost::extents[a.num_elements()]);
    std::fill(a_ref.begin(), a_ref.end(), '-');

    //to apply algorithm to one row or column, can use array_view
    //especially useful for traversing it vertically?
    //e.g:
    Array2d::array_view<1>::type views[4] = {
        a[boost::indices[range()][0]], //left column
        a[boost::indices[range()][a[0].size() - 1]], //right column
        a[boost::indices[0][range()]], //top row
        a[boost::indices[a.size()-1][range()]] //bottom row
    };
    for (unsigned i = 0; i != sizeof(views)/sizeof(views[0]); ++i) {
        std::fill ( views[i].begin(), views[i].end(), 'X' );
    }

    //output
    for (unsigned i = 0; i != a.size(); ++i) {
        std::copy(a[i].begin(), a[i].end(), std::ostream_iterator<char>(std::cout, ""));
        std::cout << '\n';
    }
}

fonte: http://cboard.cprogramming.com/cplusplus- programmazione / 112584-boost-multiarray.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top