2011-04-29 84 views
5

我需要使用boost多维数组的帮助。我必须构造的二维阵列,其中:(0 < = j的< = 1)和(i)的增长动态地根据:如何使用(Boost Multidimensional Array Library)构造动态二维数组?

long boostArray[i][j]; 

因此,这就像构造(未知)列和两行的表。

我已经开始与Boost库网站提供的例子:

#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调整大小后矢量。

回答

2

对于您的特殊用途,您最好使用vector<pair<T,T>>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. 

为了重申:N维阵列,N>2,固有地比一维酮(因为步幅因子)少得多的动态。上述调整大小需要大量的数据复制,这与向量情况不同,它只需在size()>capacity()时复制数据。