1

私はBoost(およびstackoverflowも)が初めてで、ベクトルのマルチアレイを使用したいと考えています。私はそのようにしました:

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());

インターネット上では、int、doule などを使用するマルチアレイの例しか見つかりません。multiarray で std::vector を使用することは可能ですか? 3D マルチアレイを使用できることはわかっていますが、要素としてベクトルを使用したいと思います。

4

1 に答える 1

2

Boost.MultiArray はstd::vector要素をサポートします。通常、Boost.MultiArray はコンパイル時にコンセプト チェックを実行します。したがって、コードが完全な型でコンパイルされる場合、それはサポートされるべきです。

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

  • mImage[0][0]への参照を返しますstd::vector<Vector3_t>
  • origin()は のメンバー関数ではないためstd::vector<Vector3_t>、エラーが発生します。

origin()multi-array のメンバ関数で、最初の要素のストレージのアドレスを返します。配列が正のインデックスに再インデックスされていない場合、これは0すべてのインデックス (つまりmImage.origin() == &mImage[0][0]) と同等です。


これは、int のベクトルのベクトルの複数配列を使用した簡潔で完全な例です。

#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;
}

そして実行すると、次の期待される出力が生成されます。

100
101
102
103
104
于 2013-05-14T16:40:44.657 に答える