为什么矢量具有不同的容量而不是尺寸?

时间:2016-11-23 18:15:36

标签: c++ vector data-structures

下面是向量程序,并给出了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
矢量容量:3

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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