参考:http://www.weixueyuan.net/view/6403.html

总结:

  对于vector而言,它只是一个可以伸缩长度的数组

  对于deque而言,它是一个可以操作头部和尾部的并且可以伸缩长度的数组

  对于list而言,它是一个双向链表

  在今后的程序设计过程中,如果需要使用容易,应该按照需求选择合适的容器,否则会大大降低程序的效率。

  如果我们只需要在容器尾部插入删除元素,则vector就够用了,如果还需要在头部也频繁的插入删除元素,则需要选择deque。

在前面介绍序列式的三种容器时,我们简单介绍了在容器各部位插入或删除元素时的处理效率,在此节我们做一个总结。

根据STL公布的容器各种操作效率,我们可以根据不同的需求来选择合适的容器。例如,我们需要频繁的在容器的任意位置插入或删除元素,则我们可以选择list,而非vector和deque。具体的总结见下表。

基本操作 vector deque list
在容器头部插入或删除元素 线性 恒定 恒定
在容器尾部插入或删除元素 恒定 恒定 恒定
在容器中部插入或删除元素 线性 线性 恒定
访问容器头部的元素 恒定 恒定 恒定
访问容器尾部的元素 恒定 恒定 恒定
访问容器中部的元素 恒定 恒定 线性

对于vector而言,它只是一个可以伸缩长度的数组,因此除了在尾部插入、删除数据外,在其它任何部位插入、删除数据都是线性的复杂度,容器长度越大,完成相应的操作也就越多。而访问元素则可以根据下标直接访问到,因此访问任何位置的元素,其效率都是恒定的。

对于deque而言,它是一个可以操作头部和尾部的并且可以伸缩长度的数组,因此它在头部和尾部插入、删除数据,效率是恒定的,但是在容器的中间插入元素,则它跟vector一样,同样是要移动其它元素的,因此在中部插入或删除元素效率是线性的。对于访问容器中的元素,它同样可以通过下标进行直接访问,因此效率也是恒定的。

对于list而言,它是一个双向链表,因此在任何位置插入或删除元素都不用移动其它元素,其效率始终是恒定的。对于访问元素,双向链表访问头尾元素都很方便,但是访问中间元素则需要逐一从头部或尾部一一遍历过去,因此访问容器中间的元素其效率是线性的。

在今后的程序设计过程中,如果需要使用容易,应该按照需求选择合适的容器,否则会大大降低程序的效率。如果我们只需要在容器尾部插入删除元素,则vector就够用了,如果还需要在头部也频繁的插入删除元素,则需要选择deque。

7.6 C++基本序列式容器效率比较的更多相关文章

  1. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  2. 7.5 C++基本序列式容器

    参考:http://www.weixueyuan.net/view/6402.html 总结: vector可以理解为可以在两端插入.删除数据的数组,它提供了丰富的成员函数,用于操作数据. begin ...

  3. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  4. STL源码剖析:序列式容器

    前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...

  5. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  6. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  7. STL学习笔记(序列式容器)

    Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector< ...

  8. vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。

    1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...

  9. STL源码剖析——序列式容器#1 Vector

    在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...

随机推荐

  1. (24)协程---joinall和value

    # spawn(函数,参数...) 启动一个协成 # join()  阻塞,直到某个协程执行完毕 # joinall 类似于join 只不过 g1.join() g2.join() gevent.jo ...

  2. Nr,GenBank, RefSeq, UniProt 数据库的异同

    Nr,GenBank, RefSeq, UniProt 数据库的异同 有的文章在做DEG分析时,会把reads比对到RefSeq的转录组上.我也没搞清楚这和直接比对到常规转录组上有什么区别. 文章:S ...

  3. 2017-2018-2 20165327 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165327 实验三<敏捷开发与XP实践>实验报告 实验三 <敏捷开发与XP实践> 一.实验报告封面 课程:Java程序设计 班级:1653 姓名: ...

  4. OnSen UI结合AngularJs打造”美团"APP首页 --Hybrid Ap

    1.页面效果图: 演示链接地址:http://www.nxl123.cn/bokeyuan/meiTuanDemo_home/ 2.核心代码 home.html: <ons-page id=&q ...

  5. webService上传图片

    webService /// <summary> /// 上传图片webServer 的摘要说明 /// </summary> [WebService(Namespace = ...

  6. 1 虚拟环境virtualenv

    一.windows下虚拟环境创建 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新 ...

  7. vue组件,axios ,路由

    组件(Component)自定义封装的功能. 把一个功能相关的[HTML.css和javascript]代码封装在一起组成一个整体的代码块封装模式,我们称之为“组件”. 组件就是一个html网页中的功 ...

  8. IE的“浏览器模式”和“文档模式的区别”

    1.浏览器模式 用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给网站服务器的用户代理(User_Agent)字符串的值.网站可以根据浏览器返回的不同用户代理字符串判断浏览器 ...

  9. MYSQL的C API之mysql_query

    1.首先使用MYSQL conn 连接数据库 2.设置数据库编码 3.int res = mysql_query(&conn,"SQL语句"); if(!res)表示成功 ...

  10. poj-2142-exgcd/解的和最小

    The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8816   Accepted: 3833 Descr ...