2013-09-24 133 views
11

假设我要表示的int二维矩阵为向量的向量:矢量矢量,储备

std::vector<std::vector<int> > myVec; 

内部尺寸是恒定的,比如5,且外尺寸小于或等于N。为了最大限度地减少重新分配,我想预留空间:

myVec.reserve(N); 

假定内部矢量的大小是多少?这是纯粹的实现依赖吗?这如何影响数据的空间局部性?由于内部维度是一个常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案如何改变?

+1

矢量矢量并不是表示矩形矩阵的特别好方法。这对锯齿状数组更有用,其中每行的列数不同。 –

回答

5

由于您的内部尺寸是固定的,我想你想

std::vector< std::array<int, 5> > vecs; 
vecs.reserve(N); 

这会给你预分配连续的存储,这是最佳的性能。

+1

只适用于C++ 11,请说明。 –

+0

@Samer:这是无稽之谈,'array'不需要任何C++ 11的特性,并且自2007年以来可以用'std :: tr1 :: array',甚至在'boost :: array'之前。 –

3

内部矢量的大小与调整外部矢量的大小完全无关。对于您的矢量包没有局部保证,局部性保证(即内存中的连续块)仅存在于单个矢量。

请记住,矢量对象本身具有常量sizeof -size,其实际数据通常是动态分配的。首先逼近的外部矢量是一个连续的N'指向内部向量的块。您的reserve调用不会为内部向量的可能元素保留内存,但仅针对内部向量对象本身(即其簿记数据及其指向其动态分配的数据块的指针)。

1

内部向量用默认构造函数初始化。所以,如果你写:

vector<vector<int> > vecs; 
vecs.reserve(10); 

这等同于调用的vector<int>vector<int>()每个元素的constuctor。这意味着你将有一个零大小的向量。但请记住,除非调整大小(不保留)矢量,否则不能使用它们。

请记住,有时可能更有效地调整您需要的初始大小。因此,它是有用的像做

vector<vector<int> > vecs(3,vector<int>(5)); 

这将创建一个大小为3的向量,每个元素将包含大小的矢量5

也请记住,这可能是更有效地使用双端队列而不是向量,如果你要经常调整矢量大小。它们易于使用(作为向量),并且不需要预留,因为元素在内存中不是连续的。

+0

二维矩阵很可能用于随机访问,而'deque'不能有效地执行。 –