5

ブースト多次元配列の使用について助けが必要です。(0 <= j <= 1) および (i) に従って動的に成長する 2 次元配列を作成する必要があります。

long boostArray[i][j];

したがって、(不明な) 列と 2 行のテーブルを作成するようなものです。

Boost Library Web サイトで提供されている例から始めました。

#include "boost/multi_array.hpp"
#include <cassert>

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

  int values = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        A[i][j][k] = values++;

  int verify = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        assert(A[i][j][k] == verify++);

  return 0;
}

問題は、その構造を微調整して目的の配列を構築するために、上記のコードを完全に理解していなかったことです。特に上記のようにこの配列が動的に成長する場合、Boost Library を使用しているときに、配列に要素を追加/配列から要素を削除する方法が正確にわかりません。

たとえば、ベクターを扱う場合、ベクターのサイズを変更した後にpush_backpop_backを使用する傾向があります。

4

1 に答える 1

3

vector<pair<T,T>>特定のユースケースでは、おそらくorを使用する方がよいでしょうvector<array<T,2>>。その後、 を使用できpush_back、効率的です。boost::multi_arrayオーバーキルのように聞こえます、otoh:

push_back次元配列の 1 つの次元を拡張するたびに、初期データNの次元のスライスを提供する必要があるため、そのようなものは使用できません。N-1それは通常、特に効率的ではありません。この方法では、ストライドが最大の次元にのみ追加できるためです。代わりに使用する必要があるのはresizeand 代入です。

// std::vector<> equivalent (with vector<>, it's considered bad style)
v.resize( v.size() + 1 );
v[v.size()-1] = newElement;

// boost::multi_array (from the tutorial)
typedef boost::multi_array<int, 3> array_type;

array_type::extent_gen extents;
array_type A(extents[3][3][3]);
A[0][0][0] = 4;
A[2][2][2] = 5;
// here, it's the only way:
A.resize(extents[2][3][4]);
assert(A[0][0][0] == 4);
// A[2][2][2] is no longer valid.

繰り返しNますが、 次元配列N>2は本質的に 1 次元配列よりもはるかに動的ではありません (ストライド ファクターのため)。上記のサイズ変更では、size()>capacity().

于 2011-04-29T13:42:57.927 に答える