如何使用(Boost Multidimensional Array Library)构造动态二维数组?
问题描述:
我需要使用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_back和pop_back调整大小后矢量。
答
对于您的特殊用途,您最好使用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()
时复制数据。