2013-05-14 3 views
1

Je suis nouveau sur Boost (et aussi sur stackoverflow) et je veux utiliser un multi-array de vecteurs. Je l'ai fait de cette façon:Boost Multiarray de std :: vector

typedef boost::multi_array<std::vector<Vector3_t>, 2> array_type; 
array_type* mImage; 
int mResolution = 1000; 
mImage = new array_type (boost::extents[mResolution][mResolution]); 
//works 
mImage[0][0].origin()->push_back(Vector3_t()); 
//Error: abort() 
mImage[1][1].origin()->push_back(Vector3_t()); 
//Error: abort() 
mImage[500][440].origin()->push_back(Vector3_t()); 

Sur Internet, je ne peux trouver des exemples de multiarray qui utilisent int, doule et ainsi de suite. Est-il possible d'utiliser un vecteur std :: dans un mutliarray? Je sais que je pourrais utiliser un multi-array 3D, mais je préférerais des vecteurs comme elemet. Boost.MultiArray prend en charge std::vector éléments

Répondre

2

En général, Boost.MultiArray effectuera une vérification de concept au moment de la compilation. Ainsi, si le code compile avec le type complet, il devrait être supporté.

Avec mImage[0][0].origin():

  • mImage[0][0] renvoie une référence à std::vector<Vector3_t>.
  • origin() n'est pas une fonction membre sur std::vector<Vector3_t>, ce qui entraîne une erreur.

origin() est une fonction membre de multi-array, qui renvoie l'adresse du stockage du premier élément. Dans le cas où le tableau n'a pas été réindexé à un indice positif, ceci est équivalent à 0 pour tous les index (c'est-à-dire mImage.origin() == &mImage[0][0]).


Voici un exemple bref et complet avec un multi-array d'un vecteur de vecteur d'ints.

#include <iostream> 
#include <vector> 

#include <boost/foreach.hpp> 
#include <boost/range/counting_range.hpp> 
#include <boost/multi_array.hpp> 

int main() 
{ 
    typedef std::vector<int> vector3_type; 
    typedef boost::multi_array<std::vector<vector3_type>, 2> array_type; 
    array_type array(boost::extents[5][5]); 

    // Insert vector into multi-array. 
    array[0][0].push_back(vector3_type()); 

    // Insert range of [100,105) into the first vector at [0][0] 
    BOOST_FOREACH(const int& i, boost::counting_range(100, 105)) 
    array[0][0].front().push_back(i); 

    // Print all integers at [0][0][0] 
    BOOST_FOREACH(const int& i, array[0][0][0]) 
    std::cout << i << std::endl; 
} 

et exécution produit la sortie suivante attendue:

100 
101 
102 
103 
104
Questions connexes