【问题标题】:Why vector has different capacity and other than the size? [duplicate]为什么向量具有不同的容量和大小? [复制]
【发布时间】:2016-11-23 18:15:36
【问题描述】:

下面是vector的程序,给出了c++11模式下容量的不同结果。

#include<iostream>
#include<vector>
using namespace std;

int main(){
vector<int>a ={1,2,3};
cout<<"vector a size :"<<a.size()<<endl;
cout<<"vector a capacity :"<<a.capacity()<<endl<<endl;;

vector<int>b ;
b.push_back(1);
b.push_back(2);
b.push_back(3);
cout<<"vector b size :"<<b.size()<<endl;
cout<<"vector b capacity :"<<b.capacity()<<endl;
return 0;
}

输出
向量大小:3
向量 a 容量:3

矢量 b 大小:3
矢量 b 容量:4

为什么这个程序为 a 和 b 的容量提供不同的值,而两者的值数量相同,大小与容量有何不同?

【问题讨论】:

  • 但我认为这是我问题的部分答案。因为为什么向量 a 和 b 的容量在同一台 PC 和同一编译器上会变得不同。
  • @GIRISHkuniyal 为什么不一样了?初始化不同。
  • @GIRISHkuniyal 在第一种情况下,向量知道您总共要插入多少个元素。可能您再也不会插入元素(例如:如果您已将 a 声明为 const),因此无需分配额外的元素。在第二种情况下,每个push_back 调用都假定会有更多调用,因此向量是保守的,分配更多以防万一。

标签: c++ vector data-structures


【解决方案1】:

原因与向量的扩展算法的本质有关。 初始化向量时,应用的额外容量数为 ​​0。 在第 i 次需要扩展时,向量将其包含复制到一个新向量,其容量是当前大小的两倍。 这种方法使大小更改数组的整个想法非常有效,因为在摊销时间(意味着 N 次操作的平均时间)中,我们得到 O(1) 的插入复杂度。 你可以看到,在我们向第一个向量添加一个整数之后,我们得到了 6 的容量。http://coliru.stacked-crooked.com/a/f084820652f025b8

【讨论】:

    【解决方案2】:

    通过分配比需要更多的元素,当向向量添加新元素时,向量不需要重新分配内存。此外,在减小大小时,根本不需要重新分配。

    重新分配内存是一项相对昂贵的操作(创建新块、复制元素、删除旧块)。

    权衡是向量分配的内存可能比它需要的多(例如,如果它为永远不会添加/使用的元素分配内存)。实际上,除非可用内存稀缺,否则分配更大块(并且重新分配的频率较低)的成本低于每次重新分配的成本。

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2018-11-25
      • 2023-04-10
      • 2012-08-07
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2017-09-06
      • 2023-04-02
      相关资源
      最近更新 更多