为什么向量具有不同的容量,而不是大小

Why vector has different capacity and other than the size?

本文关键字:容量 向量 为什么      更新时间:2023-10-16

以下是向量的程序,在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;
}

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

向量B大小:3
向量B容量:4

为什么此程序给出了A和B的容量不同的值,而两个值都具有相同数量的值,并且大小与容量有何不同?

原因与向量的扩展算法的本质有关。初始化向量时,施加的额外容量的数量为0。在第三次需要扩展名中,该向量将其包含的矢量复制到新向量,其容量是当前大小的一倍。这种方法使整个变化阵列的想法非常有效,因为在摊销时间(意味着n操作的平均时间),我们得到o(1)插入复杂性。您可以看到,在第一个向量添加一个额外的整数后,我们将获得6个容量。http://coliru.stacked-crooked.com/a/f084820652f025b8

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

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

权衡取舍是向量可能分配了比所需的更多内存(例如,如果它为永不添加/使用的元素分配内存)。实际上,除非稀缺可用的记忆,否则分配更大的块(较少分配的频率)的成本小于每次成本或重新分配的成本。