当收缩能力为零后,push_back会向量重新分配吗?

时间:2011-10-10 06:51:23

标签: c++

  1. 在推回之前,我将容量缩小到零,然后我将项目推回向量,它会重新分配吗?
  2. 是重新分配意味着性能下降吗?
  3. 如果是这样,为什么需要将容量缩小到零或适合大小?

    vector<int> mandy2(5);
    vector<int>().swap(mandy2);
    
    printf("mandy2 size: %d\n", mandy2.size());
    printf("mandy2 capacity: %d\n", mandy2.capacity());
    
    mandy2.push_back(1);
    mandy2.push_back(2);
    mandy2.push_back(6);
    

3 个答案:

答案 0 :(得分:2)

只要容量不足以容纳std::vector请求,

push_back就会重新分配。

  

在推回之前,我将容量缩小到零,然后我推回项目   进入矢量,它会重新分配吗?

  

是重新分配意味着性能下降吗?

从长远来看,没有(因为每次插入需要O(1)摊销时间)。我不担心它,除非分析显示 是一个问题。

  

如果是这样,为什么需要将容量缩小到零或适合大小?

我不明白这个问题。

答案 1 :(得分:2)

  1. 是的,可能。它还意味着迭代器,指针和对容器中元素的引用都是无效的。
  2. 缩小容量会减少容器的内存使用量。这将释放内存以供程序的其他部分使用。

答案 2 :(得分:1)

  

在推回之前,我将容量缩小到零,然后我将项目推回向量,它会重新分配吗?

是的,它会。

参考 doccumentation

void push_back ( const T& x );

  

在向量的末尾添加一个新元素,在其当前的最后一个元素之后。此新元素的内容初始化为x。

的副本      

这有效地将向量大小增加1,如果向量大小等于调用之前的向量容量,则会导致内部分配存储的重新分配。重新分配使以前获得的所有迭代器,引用和指针无效。


  

reallocate意味着性能下降吗?

Theorotically,是的!
只有在对相同的代码进行概要分析后,才能最终确定对您造成的伤害。


  

如果是这样,为什么需要将capacity缩小为零或适合size

如果你知道你不想在向量中添加任何其他元素,那么你只会这样做,这可以确保你的向量不会消耗比实际需要更多的内存。