C++中vector自动扩容(自动push_back)原理概述
作者:
小熊熊
,
2022-02-04 10:19:11
,
所有人可见
,
阅读 1149
扩容原理概述
- 新增元素:
vector
通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;
- 对
vector
的任何操作,一旦引起空间重新配置,指向原vector
的所有迭代器就都失效了;这也就是使用迭代器时不能插入元素的原因。
- 初始时刻
vector
的capacity
为0,塞入第一个元素后capacity
增加为1;
- 不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容。
使用不同的编译器执行下方代码就能看到相应的结果。
代码
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
cout << vec.capacity() << endl;
for (int i = 0; i<10; ++i)
{
vec.push_back(i);
cout << "size: " << vec.size() << endl;
cout << "capacity: " << vec.capacity() << endl;
}
system("pause");
return 0;
}
总结
vector
在push_back
以成倍增长可以在均摊后达到$O(1)$的事件复杂度,相对于增长指定大小的$O(n)$时间复杂度更好。
- 为了防止申请内存的浪费,现在使用较多的有2倍与1.5倍的增长方式,而1.5倍的增长方式可以更好的实现对内存的重复利用,因为更好。
参考
- CSDN