将向量重新分配时push_back后收缩容量为零

will vector reallocate when push_back after shrink capacity to zero?

本文关键字:back 容量 push 新分配 向量 分配      更新时间:2023-10-16
  1. 在推回之前,我将容量缩小到零,然后我将项目推回向量,它会重新分配吗
  2. 重新分配是否意味着性能下降
  3. 如果是这样,为什么需要将容量缩小到零或适合大小?

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

std::vector将在容量不足以容纳push_back请求时重新分配

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

是的。

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

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

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

我不明白这个问题。

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

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

是的,会的。

参考文档:

void push_back ( const T& x );

在矢量的末尾,在当前最后一个元素之后添加一个新元素。这个新元素的内容被初始化为x的副本。

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


reallocate是否意味着性能下降?

理论上,是的
只有在对代码进行分析后才能得出结论。


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

只有当您知道不想向向量中添加任何其他元素时,才可以这样做,这样可以确保向量不会消耗比实际需要的内存更多的内存。