2012-05-07 31 views
0

假设我需要一个未定数的3乘4矩阵。 (或者任何其他固定的m×n维矩阵的序列)。我的第一个想法是将这些矩阵存储在std::vector中,其中每个矩阵本身是std::vector<std::vector<double> >。如何使用std::vector::reserve()为这些矩阵的数字预先分配空间,如x?因为我知道两个维度,我应该(或者我希望)能够将这些块的大小设置为x倍。保存“块”的C++ 3D向量

我知道如何在一维std::vector实现这个目标,但我想知道如何做一个3D std::vector,如果没有其他原因,而不是更好地学习如何使用std::vector类。

+0

没有'preserve'这样的东西。 –

+0

你的意思是'reserve()','preserve'不存在像Kerrek SB所说的 – EdChum

+0

对不起,是的,我的意思是“保留”而不是“保留”。 :) – synaptik

回答

0

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

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个的存储器的单独块。

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)元素将在位置i * n + j。每个矢量本身都是一个动态容器,你可能不希望所有的地方都有那么多的动态分配。

本着同样的精神,上述reserve通话可能不会做你认为,因为它仅保留存储器内矢量的簿记数据(每载体通常三个字,即300个字以内),并为实际的数据。

鉴于这种情况,你甚至可能要考虑的std::array<int, m*n>为您的矩阵型(和访问它在进步);现在你可以实际上实际矩阵的前期预留空间 - 但mn现在必须编译时间常数。

+0

非常感谢。这非常有帮助。我非常喜欢使用'std :: array'作为矩阵类型的想法。 – synaptik