假设我想将int
的二维矩阵表示为向量矢量:
std::vector<std::vector<int> > myVec;
内部维度是常数,比如5,外部维度小于或等于N
。为了尽量减少重新分配,我想保留空间:
myVec.reserve(N);
内部向量的大小是多少?这纯粹依赖于实现吗?这如何影响数据的空间局部性?由于内部维度是常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案如何变化?
答案 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会更有效。它们易于使用(作为向量)并且您不需要保留,因为元素在内存中不连续。