主要问题
向量的resize
是否会影响性能,即使其容量大于其大小?
例如,我想为伪代码制作代码,如下面的
const size_t size_a = 2;
const size_t i_max = 3;
vector<int> a(size_a) = random_vector;
vector<int> b;
for (size_t i=0; i<i_max; i++){
patch_a_at_the_end_of_b;
}
所以,b
每次循环都会改变它的大小,但它会单调增加,我知道b
的最终大小。
首先,我创建了一个函数concat(a,b)
,使得a
的补丁b
到达void concat(const vector<int> a, vector<int> &b){
const size_t size_b = b.size();
b.resize(size_b+a.size());
for(size_t i=0; i<a.size(); i++)
b[size_b + i] = a[i];
}
。
b
请注意,每次concat
调用b.reserve
时,我们都会调整向量的大小。
然后,我在main函数的for
循环前添加const size_t size_a = 2;
const size_t i_max = 3;
vector<int> a(size_a) = random_vector;
vector<int> b;
b.reserve(size_a*i_max);
for (size_t i=0; i<i_max; i++){
concat(a,b);
}
。
{{1}}
答案 0 :(得分:3)
std::vector
操作的规范可能提供了这个问题的大部分答案。
首先,resize()
被指定为void resize(size_type n, value_type val = value_type())
,带有要求;
n
小于当前大小,则附加元素将删除并销毁其他元素(即,如果元素具有析构函数,则调用析构函数)。n
大于当前容器大小,则会通过在末尾插入尽可能多的元素来扩展内容,以达到n
的大小。如果指定了val
,则新元素将初始化为val
的副本,否则,它们将进行值初始化。n
比当前容器容量更大 (强调我的话),则会自动重新分配已分配的存储空间。请注意,如果减小容器容量,则无论如何都没有说明。
现在,reserve(size_type n)
被指定为请求向量容量为n
个或多个要素
size
没有影响,不能改变其元素。此处的第二点可能被解释为reserve()
不能用于减少容量。
注意:我在上面的解释中,但它基本上是标准要求resize()
和reserve()
的摘要。
将这些点放在一起:增加向量容量所需的resize()
(或任何其他增加向量大小的操作)的唯一情况是新大小超过当前容量。 / p>
除此之外,所发生的是实施质量问题。但是,一种合乎逻辑的实施方式是:
resize()
(和其他增加向量大小的操作)永远不会增加容量,除非新大小超过当前容量reserve()
永不减少容量在这样的实现中,在执行增加向量大小的操作之前调用reserve()
将提供性能优势(除非大小增长到超过使用reserve()
指定的容量,否则无需实际重新分配)。
如果实现使用不同的方法,例如在任何阶段减少容器的容量(例如,如果resize()
的调用减小了大小,它也会降低容量),情况可能会有所不同。这可以在尝试最小化容器的总存储器使用量时完成(即,只要vector
本身存在,就不保持分配的额外容量)。如果向量的大小在大小上振荡(例如在某些情况下增加,在其他情况下减少),这将导致性能损失。