C++ - 3-D 数据结构 - 我应该使用指针向量还是向量向量
C++ - A 3-d data structure - should I use vector of pointers or vector of vectors?
我必须维护一个三维的数据结构。因此,假设它的尺寸是:- 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++;
}
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 使用向量类的c++指针
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 如何更改唯一指针向量的可见性
- C++ 独特指针练习的向量
- C 中的向量指针的清晰图
- 当向量位于内部类中时,如何删除指向对象的向量指针
- std::向量指针
- 指向结构体的向量指针错误
- 删除指向指针的向量指针时出错
- 映射不同类型的向量指针
- 在c++中传递向量指针
- 虚拟类的向量:指针是干净的方法吗
- 如何从另一个向量/对象集构造新的向量/指针集
- 模型视图控制器- c++向量指针,太多的传递
- 为什么向量指针占用这么多内存?
- 删除条目向量指针的静态映射c++
- 复向量指针
- c++数组向量指针的初始化