http://www.cnblogs.com/ixnehc/archive/2008/09/02/1282356.html

 *.先说内部结构.vector就是一块连续的内存,这块连续的内存会随着成员的添加而不断的re-alloc,而且在重分配的时候,分配的内存的大小会 比实际需要的多一些,下次再添加成员时,就可以添加在这些多余的空间里,而不会导致每添加一个成员就需要重分配内存.vector封装的是一块连续的内 存,这是我最喜欢它的地方,因为可以把它的成员直接转换成指针来进行访问,很灵活.
 
     *.deque可以根据一个索引进行随机访问,所以我一度也以为它内部有一块连续的内存,直到有一次我真这么干的时候把程序搞当了.才意识到这个错误.deque内部应该是由很多定长的内存块组成的链表,这是我猜的,因为似乎只有这种结构才能和它的表现相符.
 
     *.往vector,deque里添加数据应该都是很快的吧,毕竟这是这两个容器的卖点.这个我没有具体测过.
 
     *.vector的遍历速度是很快的,应该是到极限了,不管你用iterator来遍历还是用一个递增的下标进行访问,经过编译器的优化都可以有最高的效率.
 
     *.deque的遍历速度也不慢,如果使用iterator来遍历,可以有接近于vector的效率,但如果直接用递增的下标进行遍历,好像编译器无法优化至最高效率,好像慢一倍左右:
      std::deque<int> buf;
      std::deque<int>::iterator it;
      int sum=0;
      for (it=buf.begin();it!=buf.end();it++)  //这样遍历比较快
            sum+=*it;
      for (int i=0;i<buf.size();i++)  //这样遍历比较慢
            sum+=buf[i];
 
     *.vector内部分配的内存是永不释放的,即使你调用clear()也不会,这一点很不好,有误导性.有可能一个vector只在瞬间需要很大的容 量,但大多数时间只需要很小的容量,结果却是长时间的占用了很大的,没有被使用到的内存.vector也没有提供函数来释放它内部的内存,不过有一个简单 的办法,前几天在网上找到的:
     i_math::vector<BYTE>buf;
     buf.resize(100000);//分配了一块至少100000 bytes的内存
     if (TRUE)//清空buf的内存
     {
           i_math::vector<BYTE> t;
           buf.swap(t);//把这块内存交换到一个临时的vector里去
     }
     assert(buf.capacity()==0);//内存被清空了
 
     *.deque就不一样了,deque永远不会占用太多冗余的内存,你只需要把它resize()到一个你希望的大小,它会自动释放掉那些被多余占用的内存
 
     *.vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用.
 
     所以我觉得deque其实在很多地方都有优势,比起vector,它欠缺的就是内存不连续,使用起来不够灵活,但它对内存使用的更经济,而访问的效率也比 vector慢不了太多,当然,它还能从前面快速插入删除,这是压倒性的优势.总之,deque是在关键时候能帮上忙的那种,平时可能还是vector更 好用一些.
 
     最后顺便说说list,我一点也不喜欢list,几乎没怎么用过,往list里添加成员是很慢的(相对与vector,deque),好像每添加一个成员 都要分配一次内存,它的遍历也很慢,好像就比map的遍历快一点,不能随机访问.唯一的优势就是可以在容器中间插入删除,不过我觉得都是可以用 vector/deque加上一些技巧解决的。反正我在程序里很少碰到过非用list不可的情况,也许是我写的程序类型还不够多吧呵呵.
 

关于VECTOR和DEQUE相关推荐

  1. STL vector list deque区别与实现

    1 vector 向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacitu ...

  2. C++ STL容器——序列式容器(array、vector、deque、list)

    概述 1.C++ STL的容器分为三种,序列式容器,关联式容器,无序式容器,这里先说说常用的序列式容器. 2.array,vector,deque,list,forward_list这几种都是序列式容 ...

  3. vector和deque的区别?

    vector和deque的区别? vector概述 vector的数据结构 vector的构造与内存管理 deque deque概述 deque的构造与内存管理 vector和deque的区别 vec ...

  4. 对比vector、deque、list的优缺点

    1.vector 连续存储结构,每个元素在内存上是连续的:支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下:相当于一个数组,但是与数组的区别为:内存空间的扩展.vector ...

  5. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  6. Array,Vector,List,Deque的区别与联系【转+改】

    数组 内存连续分配,长度大小固定,内置的最基础的数据结构之一.支持随机访问和随机存储. 该类型数据所占内存空间最小. Vector 是C++ STL中的一个容器.和数组类似,它拥有一段连续的内存空间, ...

  7. c语言实现容器,C语言三种容器:list vector和deque的区别

    在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担.还有一个就是容器,你会发现要是自己写一个链表.队列,或者是数组的时候,既要花时间还要操心怎么 ...

  8. C++基础--STL基本容器string,vector,list,deque,map

    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元 ...

  9. vector,list deque三种容器对比

    一.vector与list对比 vector: 随机访问快,即下标运算尾添加,不申请空间的情况下,速度很快不支持,快速插入和删除,比较慢 list: 随机访问慢支持快速插入和删除 二.内存对比 vec ...

最新文章

  1. python和c++的相互调用教程
  2. vue内引入jsPlumb流程控制器(一)
  3. Active Object 并发模式在 Java 中的应用--转载
  4. 10个python使用技巧
  5. 量变的一种坏结果是变质——以身说法结合实例论量与质,过程与结果2017-12-20
  6. css cursor 的可选值(鼠标的各种样式)
  7. 王者荣耀(01背包)
  8. win10电脑开机密码忘了怎么办_Mac电脑忘记开机密码怎么办?Mac开机密码快速恢复方法...
  9. 在网络中配置思科交换机
  10. linux 内核参数优化 mysql_Linux记录-mysql参数优化
  11. Android集成三方腾讯浏览器X5内核
  12. 老骥伏羲,某讯遗产K3路由器2021年刷机指南。
  13. Xmind8 Pro 最新版 破解教程(序列号|破解文件)
  14. MPLAB PICKIT3、MPLAB SIM调试
  15. 服务器2008系统设置密码,win2008服务器设置密码
  16. 这些重构小技巧,给你项目瘦瘦身吧!
  17. python主动推送链接至Bing站长平台分分钟让必应收录你的网页-必应SEO窍门
  18. MySQL 修改frm文件_mysql 之 frm+ibd文件还原data
  19. 夜战II-程序猿的骚文
  20. 绘图与图片编辑工具—“Artstudio”

热门文章

  1. boost::hana::sfinae用法的测试程序
  2. boost::fusion::insert_range用法的测试程序
  3. 宏BOOST_TEST_REF的用法程序
  4. Boost::context模块callcc的circle测试程序
  5. Boost:可移植地自定义boost :: hash的测试程序
  6. Boost:compute::copy的复制数据测试程序
  7. ITK:在没有写访问权的情况下遍历整个图像
  8. VTK:PolyData之ExtractSelectedIds
  9. OpenCV油画效果
  10. C语言Catalan number卡特兰数(使用n个键可以搜索多少个二叉搜索树)的算法(附完整源码)