假设我想将int的二维矩阵表示为向量的向量:
std::vector<std::vector<int> > myVec;内部维度是恒定的,比如5,外部维度小于或等于N。为了最大限度地减少重新分配,我想保留空间:
myVec.reserve(N);假设内部向量的大小是多少?这是纯依赖于实现的吗?这对数据的空间局部性有什么影响?由于内部维度是常量,有没有办法告诉编译器使用这个常量大小?如果内部向量的大小发生变化,这些答案会发生什么变化?
发布于 2013-09-25 05:20:18
因为你的内在维度是恒定的,我认为你想要
std::vector< std::array<int, 5> > vecs;
vecs.reserve(N);这将为您提供预先分配的连续存储,这是最佳的性能。
发布于 2013-09-25 04:51:16
内部向量的大小与调整外部向量的大小完全无关。你的向量包没有局部性保证,局部性保证(即内存中的邻接块)只存在于单个向量。
请记住,矢量对象本身具有常量sizeof-size,其实际数据通常是动态分配的。第一次近似地说,外部向量是指向内部向量的N个“指针”的连续块。您的reserve调用不会为内部向量的可能元素保留内存,而只为内部向量对象本身保留内存(即它们的记账数据和指向其动态分配的数据块的指针)。
发布于 2013-09-25 05:02:43
内部向量使用默认构造函数进行初始化。因此,如果你这样写:
vector<vector<int> > vecs;
vecs.reserve(10);这相当于为每个元素调用vector<int>或vector<int>()的构造器。这意味着你将有一个大小为零的向量。但请记住,除非调整(而不是保留)向量的大小,否则不能使用它们。
还请记住,有时根据您需要的初始大小调整大小可能会更有效。所以做一些像这样的事情很有用
vector<vector<int> > vecs(3,vector<int>(5));这将创建一个大小为3的向量,每个元素将包含一个大小为5的向量。
还请记住,如果您要经常调整向量的大小,使用deque可能比使用vector更有效。它们很容易使用(作为向量),而且不需要保留,因为元素在内存中不是连续的。
https://stackoverflow.com/questions/18991765
复制相似问题