STL进阶--vector vs deque
vector
class Dog;
// 例 1:
vector<Dog> vec(6); // vec.capacity() == 6, vec.size() == 6,
// 默认构造生成6 Dogs
// 例 2:
vector<Dog> vec; // vec.capacity() >= 0, vec.size() == 0
vec.resize(6); // vec.capacity() >= 6, vec.size() == 6,
// 默认构造生成6 Dogs
// 例 3:
vector<Dog> vec;
vec.reserve(6); // vec.capacity() >= 6, vec.size() == 0,
// 不调用默认构造
// vector容量指数型增长,用完之后会重新分配,拷贝元素
/*
* 避免重新分配内存的策略:
* 1. 如果所需的最大元素个数已知, reserve(MAX);
* 2. 如果不知道,先reserve尽可能多,等所有元素插入完毕,再将剩余的切除。
*/
deque
/*
* - 没有重新分配
* deque没有reserve()和capacity()
* - 比vector稍慢,因为数据结构比vector复杂,因为不连续定位也有一定的开销,更多的cache miss或page fault
* - 现代编译器往往会把他们放到一起
*/
//固定大小线性增长
如何选择
一般原则
- 经常需要在前面插入的? -> deque
- 性能重要的? -> vector
详细分析
元素类型
- 如果不是很小的类型,那么deque相比vector并不会低效很多
内存的可用性
- 大块的连续内存分配是否可能成为问题,内存受限
数据增长是否不可预期
vector<int> vec;
for (int x=0; x<1025; x++)
vec.push_back(x); // 11 reallocations performed (growth ratio = 2) // workaround: reserve()因为增长带来的指针/引用/迭代器失效
vector<int> vec = {2,3,4,5};
int* p = &vec[3]
vec.push_back(6);
cout << *p << endl; // 未定义的行为 deque<int> deq = {2,3,4,5};
p = &deq[3];
deq.push_back(6);
cout << *p << endl; // OK
// push_front()也OK
// deque: 在首尾插入不会使指针失效 // 注:在中间插入删除的话,还是会使指针失效
vector独有的特性: 兼容C
vector<int> vec = {2,3,4,5}; void c_fun(const int* arr, int size); c_fun(&vec[0], vec.size()); // 对于其他容器,需要先将数据拷贝到vector
list<int> mylist;
...
vector<int> vec(mylist.gegin(), mylist.end());
c_fun(&vec[0], vec.size()); // 注: &vector[0]可以当做C的数组使用
// 一个例外是: vector<bool>
void cpp_fun(const bool* arr, int size);
vector<bool> vec = {true, true, false, true};
cpp_fun(&vec[0], vec.size()); // vector<bool>的每个元素优化为由1bit来表示,可以用vecter<int>或者bitset
总结
- 经常push_front() - deque
- 高性能 - vector
- 不是细小的数据类型 - deque
- 内存受限 - deque
- 不可预期的增长 - deque
- 指针有效性 - deque
- C接口 - vector
STL进阶--vector vs deque的更多相关文章
- STL容器 vector,list,deque 性能比较
C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...
- C++——STL之vector, list, deque容器对比与常用函数
STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...
- C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- [STL] Implement "vector", ”deque“ and "list"
vector “可增的”数组 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似. 不同的地方就是: (1) 数组是静态分配空间,一旦分配了空间的大小,就不可再改变了: (2) v ...
- STL之vector,deque学习实例
``` #include<iostream> #include<algorithm> #include<ctime> #include<vector> ...
- STL学习三:deque容器
1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...
- vector,list,deque
stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...
随机推荐
- MSC服务器-主从检测脚本-check_server_state.sh
说明: 发现keepalived会在凌晨自动进行主从切换,导致msc相关进程运行不稳定: 通过运行check_server_state.sh,及时终止/启动相关进程: 所有脚本使用supervisor ...
- python函数完整语法和分类
函数初级 简介 # 函数是一系列代码的集合,用来完成某项特定的功能 优点 '''1. 避免代码的冗余2. 让程序代码结构更加清晰3. 让代码具有复用性,便于维护''' 函数四部分 '''1. 函数名: ...
- windows apache "The requested operation has failed" 启动失败
找到失败原因,进入cmd(win+r快捷键,输入cmd)命令行下 进入到你的apache bin目录下: 每个人错误可能不同,根据自己问题去相应改
- MyBatis sql语句使用总结
MyBatis中Like语句使用总结 oracle数据库: SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 : SELECT ...
- PS学习之制作音乐视屏
素材: 新建画布 插入图片素材 调整和画布一样大小 喜欢彩色的 可以加照片滤镜 喜欢黑白的可以加黑白滤镜 也可以添加自己喜欢的文字 在窗口中选择时间轴 创建视屏时间轴 图中标记得就是每秒能播放30张 ...
- hdu4614 Vases and Flowers 线段树
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- hdu4300 Clairewd’s message 扩展KMP
Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...
- String的intern()方法详解
https://blog.csdn.net/soonfly/article/details/70147205 :图解 https://blog.csdn.net/wjzhang5514/articl ...
- 监控页面后退前进,浏览器文档加载事件之pageshow、pagehide
https://www.cnblogs.com/milo-wjh/p/6811868.html http://www.runoob.com/jsref/event-onpageshow.html on ...
- linux面试题(自己添加了一些注释说明)
1.linux如何挂在windows下的共享目录 首先需要在Windows中创建一个文件夹用来共享,例如下面就是server是用来共享的,貌似在哪个位置创建都可以,我是在d盘创建的 1 mount.c ...