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

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

本文关键字:向量 指针 3-D 数据结构 我应该 C++      更新时间:2023-10-16

我必须维护一个三维的数据结构。因此,假设它的尺寸是:- l x m x n。在我希望编写的程序中,l和m将从构建数据结构时就知道。但是 n 必须在整个运行时都是动态的。对于网格 lxm 中的不同向量,n 可能不同。(一旦创建了这个结构,我永远不会打算破坏它,因为我在整个过程中都需要它(。

现在让我们假设它是一个我希望做的二维数据结构,我应该做一个向量>还是一个向量*>?我也知道如何在第一种情况下将向量初始化为所需的大小,即我可能会做类似的事情:-

vector<vector<int> > A(m)

将外部维度的大小初始化为 m。但在第二种情况下,一旦我创建了指向向量的指针向量,我该如何创建指针指向的向量。

把它带到3-d案例中,我应该使用,矢量<矢量><矢量>>或矢量<矢量><矢量*>>或其他组合?

请提出任何更改建议,以便在问题框架不正确时我可以重新构建问题。

您最好使用单个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++;
}