[C++]vector的存储方式和自增长问题
来源:互联网 发布:琼瑶毁三观台词 知乎 编辑:程序博客网 时间:2024/06/06 10:53
我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素
因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧元素copy到新空间中,并且把新元素插入到新空间的末尾
实际上,为了使vector实现快速的内存分配,实际分配的空间会比当前需要的空间多一些,vector预留了额外的存储区,用于存放新的元素
比如当前vector的size为30,实际分配的空间往往会大于30,
vector<int> v;for (int i=0; i!=30; ++i){v.push_back(i);}cout<<"size="<<v.size()<<endl;cout<<"capacity="<<v.capacity()<<endl;
如果再往此vector中插入元素,则一开始会使用预先分配到内存,也就是不需要重新分配,这样的本质是一次分配一块较大的空间,可以节省分配和复制元素的消耗,往往性能也比较高
正因为实现vector的时候,对此做了优化,所以我们往往更喜欢使用vector而不是list,当然,这也需要看使用的场景,list更适合在需要随机插入和删除元素的场景,如果不需要,往往使用vector更合适
同时,vector的这种存储机制也可能会出现问题,当机器内存没有办法分配vector需要的较大的连续的存储空间时,就会导致分配失败,并且抛出一个异常,而list却不一定
假设,内存还有100,连续的空间有10,30,50,10,如果使用vector,需要连续的空间80,则会分配失败,而使用list,则不会有这个问题,list并不要求使用连续的空间
当然,如果vector和list需要空间120,则用哪一种方式都会导致分配失败
这里写这么多,只是想说明并不一定vector就更适合顺序访问,list更适合随机删除/插入,有时候还需要考虑机器的内存和实际的使用场景,只有了解好了容器本身的实现机制,才能更好的使用它们
- [C++]vector的存储方式和自增长问题
- Vector的自增长方式
- vector的自增长问题
- vector容器的自增长
- vector容器的自增长
- vector的capacity增长方式
- vector的capacity增长方式
- C++ 的Vector增长方式
- 9.4 vector容器的自增长
- 顺序容器:vector的自增长特性
- 顺序容器:vector的自增长特性
- C++ vector容器的自增长
- C++中vector容器的自增长
- c++ vector的容量增长方式
- vector内存增长方式
- vector内存增长方式
- 关于oracle自增长序列和mybatis的使用问题
- 产生自增长ID的存储过程
- 将自已的程序加到鼠标右键菜单里
- linux文件操作
- 堆和栈的区别 (转贴)
- 黑马程序员-Java模拟交通灯
- 黑马程序员-Java模拟银行业务
- [C++]vector的存储方式和自增长问题
- UVA 11549 Calculator Conundrum
- QT4.8.1和Qt4.8.4编译X86出错:/usr/include/linux/futex.h:96: 错误:‘u32’ 在此作用域中尚未声明
- 使用poi操作导入excel代码示例
- 【iPone(iOS)相关开发】
- 蛋白质结构与功能的预测方法总结和资料汇总
- 如果人生不得意
- git配色问题
- Cocos2d-x内存管理的一种实现 [转]