C ++ 3D矢量保留“块”

时间:2012-05-07 23:13:45

标签: c++ vector multidimensional-array stdvector preserve

假设我需要不确定数量的3乘4矩阵。 (或者是任何其他固定的m×by-n维矩阵的序列。)我首先想到的是将这些矩阵存储在std::vector中,其中每个矩阵本身都是std::vector<std::vector<double> >。如何使用std::vector::reserve()为这些矩阵中的数字(例如x)预分配空间?因为我知道两个维度,我应该(或者我想)能够x倍于这些块的大小。

我知道如何在1D std::vector中实现此对象,但我想知道如何在3D std::vector中执行此操作,如果没有其他原因,请更好地学习如何使用std::vector类。

2 个答案:

答案 0 :(得分:1)

将矩阵存储为向量矢量可能效率很低,但如果必须,那就去吧。保留空间与以往一样:

typedef std::vector<std::vector<int>> matrix_type;

std::vector<matrix_type> collection;

collection.reserve(100);  // set capacity for 100 "matrices"

// make 10 4x3-matrices; `collection` won't reallocate
collection.resize(10, matrix_type(4, std::vector<int>(3)));

对于你的基类型,你可能更好的是拥有一个m * n元素的向量并且可以大步访问它,即(i,j) th 元素就位i * n + j。每个向量本身都是一个动态容器,你可能不希望所有的动态分配到处都是。

同样地,上面的reserve调用可能没有你想的那样,因为它只为内部向量的簿记数据保留记忆(通常每个向量三个单词,即300个单词),并且< em> not 表示实际数据。

有鉴于此,您甚至可以考虑将std::array<int, m*n>作为矩阵类型(并以步幅方式访问它);现在你可以实际预留实际矩阵的空间 - 但mn现在必须是编译时常量。

答案 1 :(得分:0)

更好的方法是提供类接口,并为整个矩阵使用单个线性内存块。然后,您可以通过不同的方式实现该接口,范围从适当大小的内部数组(如果大小是大小的一部分),或通过提供索引(std::vector<int>)单个pos = row*cols + col

std::vector< std::vector<int> >方法中,外部向量将分配内存来存储内部向量,并且每个向量将分配内存以保存其自己的元素。使用原始指针,内存布局类似于:

int **array = new int*[ N ];
for ( int i = 0; i < N; ++i ) 
   array[i] = new int[ M ];

那是:

[ 0 ] -------> [ 0, 1, 2, ... ]
[---]
[ 1 ] -------> [ 0, 1, 2, ... ]
[ . ]
[ . ]

或基本上N + 1个独立的内存块。