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<int> > A(m)
将外部尺寸的大小初始化为 m。但是在第二种情况下,一旦我创建了一个指向向量的指针向量,我如何创建指针指向的向量。
将其带到 3-d 案例中,我应该使用 ,
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 案例?我的意思是这个公式。 我还是有些困惑。让我们考虑二维情况。我创建了一个向量:- vectorDIM_X x DIM_Y
的向量,例如std::vector<double> 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<vector<>>
,没有别的办法。但在这种情况下,你不应该说你有一个L x M x N
结构,因为你确实有一个类似于矩形网格的东西,其中包含可变长度的“列”。在这种情况下,您可以通过使用 vector<vector>
(而不是 vector<vector<vector>>
,将 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 数据结构 - 我应该使用指针向量还是向量向量?的主要内容,如果未能解决你的问题,请参考以下文章
我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以