传染媒介,储备

时间:2013-09-24 20:49:41

标签: c++ stdvector

假设我想将int的二维矩阵表示为向量矢量:

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

内部维度是常数,比如5,外部维度小于或等于N。为了尽量减少重新分配,我想保留空间:

myVec.reserve(N);

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

3 个答案:

答案 0 :(得分:13)

由于你的内在维度不变,我认为你想要

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

这将为您提供预先分配的连续存储,这对性能而言是最佳的。

答案 1 :(得分:8)

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

请记住,矢量对象本身具有常量sizeof - 大小,其实际数据通常是动态分配的。对于第一近似,外向量是与内向量的N'指针的连续块。你的reserve调用不会为内部向量的可能元素保留内存,而只保留内部向量对象本身(即它们的簿记数据及其动态分配数据块的指针)。

答案 2 :(得分:4)

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

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

这相当于为每个元素调用vector<int>vector<int>()的构造函数。这意味着你将拥有一个零大小的向量。但请记住,除非你调整(不保留)你的向量,否则你不能使用它们。

请记住,使用您需要的初始大小调整大小有时会更有效。所以做一些像

这样的事情很有用
vector<vector<int> > vecs(3,vector<int>(5));

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

还要记住,如果你要经常调整你的向量,那么使用deque而不是vector会更有效。它们易于使用(作为向量)并且您不需要保留,因为元素在内存中不连续。

相关问题