参考: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. Server SQL Modes

    The MySQL server can operate in different SQL modes, and can apply these modes differently for diffe ...

  2. GWAS | 全基因组关联分析 | Linkage disequilibrium (LD)连锁不平衡 | 曼哈顿图 Manhattan_plot | QQ_plot | haplotype phasing

    现在GWAS已经属于比较古老的技术了,主要是碰到严重的瓶颈了,单纯的snp与表现的关联已经不够,需要具体的生物学解释,这些snp是如何具体导致疾病的发生的. 而且,大多数病找到的都不是个别显著的snp ...

  3. hadoop 企业应用案例--大众点评

    hadoop 企业应用案例--大众点评 http://f.dataguru.cn/thread-260531-1-1.html

  4. android ------- TCP与UDP

    TCP TCP(Transmission Control Protocol,传输控制协议) 即传输控制协议,是一种传输层通信协议 特点:面向连接.面向字节流.全双工通信.可靠 面向连接:指的是要使用T ...

  5. IDEA分享项目到GitHub出现Could not read from remote repository

    如果VCS->Import into Version Control->Share Project on GitHub出现如下错误:: 重点在最后一行Could not read from ...

  6. 5月21 练习AJAX的查看详细及批量删除

    老师讲过之后的复习: 显示数据的代码部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  7. Java异常及错误

    java提供了两种异常机制,可以分为运行时异常(RuntimeException)与检查式异常(checked Exception). 检查式异常:java编译器对于这种异常需要我们对其用try... ...

  8. HDU-2874-森林求LCA/tarjan

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 给出一个森林,询问任意两点最短距离. tarjan跑一遍即可,就是这个题卡内存,vector会MLE,换前 ...

  9. Mac 安装md5sum等

    一.安装md5sum 方案1.使用brew 安装 方案2.使用源码编译安装 源码下载地址:http://www.microbrew.org/tools/md5sha1sum/md5sha1sum-0. ...

  10. Node.js + Express 接口请求(GET、POST、PUT)事例

    路由 路由是指应用程序的端点(URI)如何响应客户端请求.有关路由的介绍,请参阅基本路由. 您可以使用Express app对象的方法定义路由,这些方法对应于HTTP方法; 例如,app.get()处 ...