动态数组是指会自动扩充空间,其采用的也是动态内存。
1. vector是表示可变大小数组的序列容器.(因此其空间存在于堆上)
2. 就像数组一样,vector也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效,但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理.(在我们向vector中插入元素的时候,该容器会在代码中判断容器的空间是否够用,不够则要进行扩容)
3. 本质讲,vector使用动态分配数组来存储它的元素,当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间,其做法是,分配一个新的数组,然后将全部元素移到这个数组,就时间而言,这是一个相对代价高的任务,因此每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小.
4. vector分配空间策略: vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大,不同的库采用不同的策略权衡空间的使用和重新分配,但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的.
5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,以一种有效的方式动态增长.
6. 与其它动态序列容器相比 (deques, lists and forward_lists) vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效,对于其它不在末尾的删除和插入操作,效率更低,比起lists和forward_lists统一的迭代器和引用更好.
7.使用时主要包含头文件: #include <vector>
————————————————
版权声明:本文为CSDN博主「陆陆陆ovo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_49312527/article/details/124241175
默认构造函数的元素个数(size)为0,所占内存空间(capacity)为0。因此:
在默认构造的容器中(比如v1)插入数据后,size和capacity不一定相同。
vector<int> v2(10); //构造时就分配空间,size值和capacity的值相同,同时插入十个元素,元素的值都为0.
vector<int> v2(10, 666); //构造,且将值都赋值为666
vector<int> v3(v2); //拷贝构造函数
vector<int> v4(v2.begin()+3, v2.end()); //v2.begin()是迭代器,本质是指针。选取这段区间来构造。
int test[ ] = {1, 2, 3, 4, 5}; vector<int> v5(test, test+2); //只传入 1, 2 两个元素。
赋值的时候,capacity不一定会和size一起改变。原本capacity很大时,赋值一个在capacity范围内的多个元素时,
仅仅是size改变,capacity并不会改变。(不会重新开辟新空间。)
返回类型为空, int && _Val是指对右值的引用,这是c++11新特性。
删除的时候,后面若有元素将会往前填补空间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!