最重要的区别,是内部实现上。deque是分段存储的。

都是支持随机存取。

http://www.cnblogs.com/zhuyf87/archive/2012/12/09/2809896.html

deque与vector的主要不同之处在于:

1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。

2. 元素的存取和迭代器的动作比vector稍慢。

3. 迭代器需要在不同区块间跳转,所以它非一般指针。

4. 因为deque使用不止一块内存(而vector必须使用一块连续内存),所以deque的max_size()可能更大。

5. 不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。

6. 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。

7. deque的内存区块不再被使用时,会自动被释放。deque的内存大小是可自动缩减的。

8. deque与vector组织内存的方式不一样。在底层,deque按“页”(page)或“块”(chunk)来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。例如,一个10M字节的vector使用的是一整块10M字节的内存,而deque可以使用一串更小的内存块,比如10块1M的内存。所以不能将deque的地址(如&deque[0])传递给传统的C API,因为deque内部所使用的内存不一定会连续。


deque的下述特性与vector差不多:

1. 在中部安插、删除元素的速度较慢。

2. 迭代器属于random access iterator(随机存取迭代器)。


优先使用vector,还是deque?

c++标准建议:vector是那种应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时,应该选用deque。


使用deque还需注意:

1. 除了at(),其它成员函数均不会检查索引或迭代器是否有效。

2. 任何插入或删除动作都会使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在头部或尾部插入元素(此时pointers和references仍然有效,但iterators失效)。


最新文章

  1. 第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
  2. linux特殊符号大全
  3. 纯CSS3实现3D特效的iPhone 6动画
  4. RecyclerView和ScrollView嵌套使用
  5. 安卓开发_慕课网_ViewPager实现Tab(App主界面)
  6. Jqueryの锋利的jquery练习
  7. nenu contest2
  8. 转载--配置WAMP开发环境
  9. git 版本历史
  10. linux下测试磁盘的读写IO速度【转】
  11. 手机装linux系统
  12. CF552E 字符串 表达式求值
  13. Android studio java.lang.UnsatisfiedLinkError
  14. JaveScript函数(JS知识点归纳六)
  15. 负载均衡器之 Haproxy
  16. Antd & ice
  17. go语言中make和new的区别
  18. 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案
  19. Rsync服务介绍与配置
  20. Oracle.DataAccess.dll方式操作oracle数据库

热门文章

  1. 创建一个Spring的HelloWorld程序
  2. hdu_2871
  3. BZOJ5042: LWD的分科岛
  4. PHP 二维数组去掉重复值并保持原结构
  5. Deleting elements
  6. 3.bind与仿函数以及普通函数
  7. Intellij使用"easyexplore"
  8. 14个优秀 JS 前端框架、库、工具及其使用时机
  9. [BZOJ2821]作诗(分块)
  10. js cookie 页面倒计时