【问题标题】:How to use the (the Boost Multidimensional Array Library) to construct a dynamic two-dimensional array?如何使用(Boost多维数组库)构造动态二维数组?
【发布时间】:2011-08-15 11:52:54
【问题描述】:

我在使用 boost 多维数组方面需要帮助。我必须构造一个二维数组,其中: (0

long boostArray[i][j];

因此,这就像构建一个包含(未知)列和两行的表。

我已经从 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;
}

问题是我没有彻底理解上面的代码,以便调整它的结构并构建我想要的数组。在使用 Boost Library 时,我不确切知道如何在我的数组中添加/删除元素,特别是如果这个数组像我上面描述的那样动态增长。

例如,在处理向量时,我倾向于在调整向量大小后使用:push_back和pop_back。

【问题讨论】:

    标签: c++ boost multidimensional-array dynamic-arrays


    【解决方案1】:

    对于您的特定用例,您最好使用vector&lt;pair&lt;T,T&gt;&gt; 或vector&lt;array&lt;T,2&gt;&gt;。然后你可以使用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.
    

    重申一下:N 维数组 N&gt;2 本质上比一维数组动态性要低得多(因为步幅因子)。上述resize需要大量复制数据,不像vector的情况,只需要在size()&gt;capacity()时复制数据。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多