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

Posted

技术标签:

【中文标题】C++ - 3-d 数据结构 - 我应该使用指针向量还是向量向量?【英文标题】:C++ - A 3-d data structure - should I use vector of pointers or vector of vectors? 【发布时间】:2015-09-20 02:26:09 【问题描述】:

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

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

vector<vector<int> > A(m)

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

将其带到 3-d 案例中,我应该使用 , vector> 或 vector> 或其他组合?

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

【问题讨论】:

【参考方案1】:

您最好使用单个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>>> v5, vec<vec<double>>4, vec<double>3;

编辑

响应您的最新编辑:使用

std::vector<std::vector<double>> vDIM_X*DIM_Y, std::vector<double>;
// address (x,y,z)
v[y*DIM_X+x, z] = val_x_y_z;

如果您进一步了解内部向量的维度,您可以使用std::vector::reserve 为它们预分配内存。这将加快速度,因为不会有任何(缓慢的)重新分配。

【讨论】:

所以你提到这个是针对 2-d 案例还是 3-d 案例?我的意思是这个公式。 我还是有些困惑。让我们考虑二维情况。我创建了一个向量:- vector A ?我应该如何在其中插入元素?外部尺寸是固定的,但内部是动态的。 @ameyask86 你创建一个大小为DIM_X x DIM_Y 的向量,例如std::vector&lt;double&gt; v(DIM_X * DIM_Y);,然后通过公式v[y*DIM_Y+x] = val_x_y; 插入其中,你打算之后更改DIM_Y 维度吗?跨度> 是的,第二个维度是可变的。正如我所提到的,它是动态的。因此我很困惑如何插入元素。它不仅是动态的,向量的大小也会不同。例如,我可以将二维结构设为:- 3,8,1,2,3,4,6,7 。在这个例子中,外部维度的大小是 3,另一个维度是可变的,对于第一个向量它的 2,对于第二个它的 3,对于第三个它的 3。结构以后可能变成:- 3,8,1,2 ,3,4,6,7,9,11 ,即在第三个向量中添加了 2 个元素。 @ameyask86 那么你有类似矩阵的东西还是只是一个向量的向量,后者是各种维度的?如果是这种情况,那么你需要使用vector&lt;vector&lt;&gt;&gt;,没有别的办法。但在这种情况下,你不应该说你有一个L x M x N 结构,因为你确实有一个类似于矩形网格的东西,其中包含可变长度的“列”。在这种情况下,您可以通过使用 vector&lt;vector&gt;(而不是 vector&lt;vector&lt;vector&gt;&gt;,将 2D 转换为 1D,但对可变长度列使用内部向量)来加快程序速度。【参考方案2】:

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

【讨论】:

以上是关于C++ - 3-d 数据结构 - 我应该使用指针向量还是向量向量?的主要内容,如果未能解决你的问题,请参考以下文章

JNIC向C++改造

如何复制 C++ 指针数据? [复制]

我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以

我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?

指针网格保持空间结构随对象数量的变化 C++

C++ 中的指针错误