繁体   English   中英

C ++-3-d数据结构-我应该使用指针向量还是向量向量?

[英]C++ - A 3-d data structure - should I use vector of pointers or vector of vectors?

我必须维护一个3维的数据结构。 因此,让我们说它的尺寸为:-lxmx n。 自从构建数据结构以来,在我希望编写l和m的程序中就已经知道了。 但是n必须在整个运行时都是动态的。 对于网格lxm中的不同向量,n可能不同。 (一旦创建了此结构,就永远不会破坏它,因为我将一直需要它)。

目前,让我们假设它是我要制作的二维数据结构,我应该制作vector <vector <int >>还是vector <vector <int> *>吗? 我也知道如何在第一种情况下将向量初始化为所需的大小,即我可以做类似的事情:-

vector<vector<int> > A(m)

将外部尺寸的大小初始化为m。 但是在第二种情况下,一旦创建了指向矢量的指针的矢量,就如何创建指针指向的矢量。

我应该使用3-d情况下的vector <vector <vector >>或vector <vector <vector * >>或其他组合吗?

请提出任何修改建议,以便在问题的框架不正确时重新提出问题。

您最好使用单个vector (而不是嵌套vector ),因为在这种情况下保证了内存是连续的,并且由于没有缓存未命中,因此您的代码将更快。 在这种情况下,您需要从3D(2D)映射到1D,反之亦然,但这很简单

对于2D:

(x,y) <-> y*DIM_X + x;

对于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为它们预先分配内存。 由于不会有任何(缓慢的)重新分配,因此可以加快处理速度。

否,请使用适当的多维数组: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++;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM