vector的特性类似于数组,在内存空间中拥有一段连续的空间。当插入新的元素内存不够时,会自动扩容,不同的编译器扩容的倍数也不一样,通常为原容量的两倍。扩容之后将原来的元素拷贝到新的内存空间上,然后把原来的内存空间释放掉。因为内存空间是连续的所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为On.
2、相关函数介绍
1、resize()函数
resize即重置容器空间。当设置值小于当前容器空间时,会将目前容器超出部分释放掉;当设置值(及函数的参数)大于当前容器空间时,会在当前空间基础上增加容量。
2、reserve()函数
预留容器空间。当设置值大于当前容器空间时,会增加当前容器空间的大小。
3、总结
● 扩容机制是自动扩容的,当然也可以自己通过函数扩容。扩容之后会把原来旧空间元素拷贝到新空间,如何把旧空间释放掉。
● 当vector的当前容器所用空间等于容器总空间时会发生扩容。
● 扩容的倍数不一定,通常是原空间的2倍或者1.5倍。
● 在日常使用中,如果只是简单的push_back(在vector最后插入一个元素)插入数据,会带来频繁的数据拷贝,这对程序执行效率影响很大,因此提前调整容器的空间对程序性能提升很有意义。
4、示例:
vector<int>dp(20);//以及提前说明dp数组大小为20.
int n = 20;
while (n--)
{
dp.push_back(1);
cout << "当前使用的大小:" << dp.size()<<" " << "总容量大小:" << dp.capacity() << endl;
}
结果:发生了扩容,因为push_back是在最后一位插入,前面的dp(20)个元素值全为0.
![](https://i-blog.csdnimg.cn/blog_migrate/ff13fcb508719d914c08fab47dc75fdf.png)
vector<int>dp;//不提前说明dp的大小,效果是一样的,也发生了扩容。
int n = 20;
while (n--)
{
dp.push_back(1);
cout << "当前使用的大小:" << dp.size()<<" " << "总容量大小:" << dp.capacity() << endl;
}
结果:发生了扩容。
![](https://i-blog.csdnimg.cn/blog_migrate/9c4925ff372d319b3869e4c2c389bc77.png)
vector<int>dp(20);
int n = 20;
int i = 0;
while (n--)
{
dp[i] = 1;//最好是采用这种方式,避免频繁的数据拷贝
i++;
cout << "当前使用的大小:" << dp.size()<<" " << "总容量大小:" << dp.capacity() << endl;
}
结果:没有发生扩容
![](https://i-blog.csdnimg.cn/blog_migrate/f51e04341405a2cc542ce0ba79559eba.png)