调整大小并保留在向量中

时间:2016-12-27 04:18:23

标签: c++ vector dynamic-memory-allocation

主要问题

向量的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}}

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个或多个要素

  • 如果n大于当前矢量容量,则该函数会导致 重新分配其存储容器增加其容量为n (或更高)。
  • 在所有其他情况下,函数调用不会导致重新分配,矢量容量也不会受到影响。
  • 此函数对向量size没有影响,不能改变其元素。

此处的第二点可能被解释为reserve()不能用于减少容量。

注意:我在上面的解释中,但它基本上是标准要求resize()reserve()的摘要。

将这些点放在一起:增加向量容量所需的resize()(或任何其他增加向量大小的操作)的唯一情况是新大小超过当前容量。 / p>

除此之外,所发生的是实施质量问题。但是,一种合乎逻辑的实施方式是:

  • resize()(和其他增加向量大小的操作)永远不会增加容量,除非新大小超过当前容量
  • reserve()永不减少容量

在这样的实现中,在执行增加向量大小的操作之前调用reserve()将提供性能优势(除非大小增长到超过使用reserve()指定的容量,否则无需实际重新分配)。

如果实现使用不同的方法,例如在任何阶段减少容器的容量(例如,如果resize()的调用减小了大小,它也会降低容量),情况可能会有所不同。这可以在尝试最小化容器的总存储器使用量时完成(即,只要vector本身存在,就不保持分配的额外容量)。如果向量的大小在大小上振荡(例如在某些情况下增加,在其他情况下减少),这将导致性能损失。