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数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...
随机推荐
- kali的安装
https://www.youtube.com/watch?v=sB3bchzlwio 注意视频中选择的是kali 2016.2版本, 在VMware中选择了Linux-Debian 8.*64(好像 ...
- [LeetCode&Python] Problem 506. Relative Ranks
Given scores of N athletes, find their relative ranks and the people with the top three highest scor ...
- CodeForces - 1101D:GCD Counting (树分治)
You are given a tree consisting of n vertices. A number is written on each vertex; the number on ver ...
- CH0101 a^b、 CH0102 64位整数乘法(快速幂、快速乘)【模板题】
题目链接:传送门 //a^b 传送门 //64位整数乘法 题目: 描述 求 a 的 b 次方对 p 取模的值,其中 ≤a,b,p≤^ 输入格式 三个用空格隔开的整数a,b和p. 输出格 ...
- js 调用 手机 相机摄像机麦克风
https://www.cnblogs.com/avon/p/5996368.html
- 再回首 基本数据类型和 if语句
一 变量:(使用变量是不能加引号,要不就变成字符串了) 变量的命名规则: 1.数字,字母,下划线组成. 2.变量不能是数字开头 3.区分大小写 4.不要使用中文或者拼音 5.要有相应的意义 6.不能使 ...
- 集合框架 ArrayList LinkedList(待续)
ArrayList中存储的元素的内存空间是连续的, LinkedList内存空间不是连续的 集合对象不能被序列化到硬盘中 http://blog.csdn.net/eson_15/article/de ...
- oracle查询A表中主键都被哪些表引用了?
select r.TABLE_NAME from USER_CONSTRAINTS p, USER_CONSTRAINTS r where p.TABLE_NAME = 'IAM_AUDIT_FIND ...
- MySQL Config--参数system_time_zone和参数time_zone
全局参数system_time_zone系统时区,在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参数system_time_zone的值. The system time zone. W ...
- MySQL Session--批量KILL会话
使用SELECT INTO OUTFILE+SOURCE批量KILL ## 查看kill_id文件是否存在 SYSTEM cat /tmp/kill_id.sql ## 如果文件存在,则先删除 sys ...