假设我要表示的int
二维矩阵为向量的向量:矢量矢量,储备
std::vector<std::vector<int> > myVec;
内部尺寸是恒定的,比如5,且外尺寸小于或等于N
。为了最大限度地减少重新分配,我想预留空间:
myVec.reserve(N);
假定内部矢量的大小是多少?这是纯粹的实现依赖吗?这如何影响数据的空间局部性?由于内部维度是一个常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案如何改变?
假设我要表示的int
二维矩阵为向量的向量:矢量矢量,储备
std::vector<std::vector<int> > myVec;
内部尺寸是恒定的,比如5,且外尺寸小于或等于N
。为了最大限度地减少重新分配,我想预留空间:
myVec.reserve(N);
假定内部矢量的大小是多少?这是纯粹的实现依赖吗?这如何影响数据的空间局部性?由于内部维度是一个常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案如何改变?
由于您的内部尺寸是固定的,我想你想
std::vector< std::array<int, 5> > vecs;
vecs.reserve(N);
这会给你预分配连续的存储,这是最佳的性能。
只适用于C++ 11,请说明。 –
@Samer:这是无稽之谈,'array'不需要任何C++ 11的特性,并且自2007年以来可以用'std :: tr1 :: array',甚至在'boost :: array'之前。 –
内部矢量的大小与调整外部矢量的大小完全无关。对于您的矢量包没有局部保证,局部性保证(即内存中的连续块)仅存在于单个矢量。
请记住,矢量对象本身具有常量sizeof
-size,其实际数据通常是动态分配的。首先逼近的外部矢量是一个连续的N'指向内部向量的块。您的reserve
调用不会为内部向量的可能元素保留内存,但仅针对内部向量对象本身(即其簿记数据及其指向其动态分配的数据块的指针)。
内部向量用默认构造函数初始化。所以,如果你写:
vector<vector<int> > vecs;
vecs.reserve(10);
这等同于调用的vector<int>
或vector<int>()
每个元素的constuctor。这意味着你将有一个零大小的向量。但请记住,除非调整大小(不保留)矢量,否则不能使用它们。
请记住,有时可能更有效地调整您需要的初始大小。因此,它是有用的像做
vector<vector<int> > vecs(3,vector<int>(5));
这将创建一个大小为3的向量,每个元素将包含大小的矢量5
也请记住,这可能是更有效地使用双端队列而不是向量,如果你要经常调整矢量大小。它们易于使用(作为向量),并且不需要预留,因为元素在内存中不是连续的。
二维矩阵很可能用于随机访问,而'deque'不能有效地执行。 –
矢量矢量并不是表示矩形矩阵的特别好方法。这对锯齿状数组更有用,其中每行的列数不同。 –