如何使用(Boost Multidimensional Array Library)构建动态二维数组?

Com*_*org 5 c++ boost multidimensional-array dynamic-arrays

我在使用boost多维数组时需要帮助.我必须构造一个二维数组,其中:(0 <= j <= 1)和(i)根据以下内容动态增长:

long boostArray[i][j];
Run Code Online (Sandbox Code Playgroud)

因此,它就像构建一个(未知)列和两行的表.

我已经开始使用Boost Library网站提供的示例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

问题是我没有完全理解上面的代码,以便调整其结构并构建我想要的数组.我不知道在使用Boost库的过程中如何向/从我的数组中添加/删除元素,特别是如果这个数组如上所述动态增长的话.

例如,在处理向量时,我倾向于在调整向量大小后使用:push_backpop_back.

Mar*_*utz 4

对于您的特定用例,您最好使用vector<pair<T,T>>or vector<array<T,2>>。然后你就可以使用push_back,而且效率很高。boost::multi_array听起来有点矫枉过正,otoh:

您不能使用类似的东西push_back,因为每当您扩展N维数组的一维时,您都需要提供N-1初始数据的一个维度切片。这通常不是很有效,尤其是。因为你只能以这种方式添加到步幅最大的维度。您需要使用的是resize和 赋值。

// 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.
Run Code Online (Sandbox Code Playgroud)

重申一下:N一维数组N>2本质上比一维数组的动态性要低得多(由于跨步因子)。上面的resize需要大量的数据复制,不像vector的情况,只需要在 的时候复制数据size()>capacity()