我必须维护一个三维的数据结构。所以我们说它的尺寸是: - l x m x n。在我希望编写的程序中,从构造数据结构的时间开始,我将知道l和m。但是n必须在整个运行时都是动态的。并且对于网格lxm中的不同向量,n可以是不同的。 (一旦创建了这个结构,我就不打算破坏它,因为我将需要它。)
暂时让我们假设它是一个我希望制作的二维数据结构,我应该制作一个向量< vector< int>>或矢量< vector< int> *> ?另外我知道如何在第一种情况下将矢量初始化为所需的大小,即我可能会这样做: -
((B) ob1).sub();
将外部尺寸的大小初始化为m。但在第二种情况下,一旦我创建了一个指向矢量的指针矢量,我该如何创建指针所指向的矢量。
将这个带到三维的情况下,我应该使用, 矢量< vector< vector>>或矢量< vector< vector *>>还是其他一些组合?
请提出任何更改,以便我可以重新构建问题,如果它没有正确框架。
答案 0 :(得分:4)
你最好使用单个vector
(而不是嵌套的),因为在这种情况下内存保证是连续的,并且由于没有缓存未命中,你的代码会更快。在这种情况下,您需要从3D(2D)映射到1D,反之亦然,但这非常简单
表示2D:
(x,y) <-> y*DIM_X + x;
for 3D:
(x,y,z) <-> z*(DIM_Y*DIM_X) + y*DIM_X + x;
如果你真的坚持使用嵌套向量,你可以这样做:
#include <vector>
template<typename T>
using vec = std::vector<T>; // to save some typing
int main()
{
// creates a 5 x 4 x 3 vector of vector of vector
vec<vec<vec<double>>> v{5, vec<vec<double>>{4, vec<double>{3}}};
}
修改强>
回复您的最新修改:使用
std::vector<std::vector<double>> v{DIM_X*DIM_Y, std::vector<double>};
// address (x,y,z)
v[y*DIM_X+x, z] = val_x_y_z;
如果您进一步了解内部向量的维度,可以使用std::vector::reserve
为它们预先分配内存。这样可以加快速度,因为不会有任何(缓慢的)重新分配。
答案 1 :(得分:0)
不,使用正确的多维数组:Boost MultiArray http://www.boost.org/doc/libs/1_59_0/libs/multi_array/doc/user.html
#include "boost/multi_array.hpp"
int main () {
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<int, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// Assign values to the elements
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++;
}