7.6 C++基本序列式容器效率比较
参考: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++基本序列式容器效率比较的更多相关文章
- STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
- 7.5 C++基本序列式容器
参考:http://www.weixueyuan.net/view/6402.html 总结: vector可以理解为可以在两端插入.删除数据的数组,它提供了丰富的成员函数,用于操作数据. begin ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- STL源码剖析:序列式容器
前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL学习笔记(序列式容器)
Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector< ...
- vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。
1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...
- STL源码剖析——序列式容器#1 Vector
在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...
随机推荐
- 第十二周(MySort)
注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链 ...
- WAV和PCM文件转换的程序
using System;using System.IO;using System.Text;using System.Windows.Forms;using System.Runtime.Inter ...
- NexT 个性化设置
NexT 主题添加分类页面 新建页面 在本地使用终端 cd 到 blog 文件夹下,执行如下命令: $ cd Documents/blog $ hexo new page categories 设置页 ...
- p2725 Stamps
背包. #include <iostream> #include <cstdio> #include <cmath> #include <algorithm& ...
- 关于java和c语言中,变量重名问题
请看下面的两段代码: #include <iostream>#include <cstdio>#include <cstring> using namespace ...
- 苹果手机marquee显示文字不全,如何解决?
不能给marquee设定宽度,如果想只显示屏幕宽度的一部分,就给marquee外面包一个div,给外面的div设定宽度,这样就解决了文字显示不全的问题
- pre打印
echo "<pre>";print_r(var);echo "</pre>";
- 4月18 数据库的CRUD操作
php主要是实现B/S Brower Server;此外还有C/S:Client Server暂时不考虑: LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言,而现在学的是在wi ...
- RabbitMQ、Redis、Memcache
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- leetcode-algorithms-29 Divide Two Integers
leetcode-algorithms-29 Divide Two Integers Given two integers dividend and divisor, divide two integ ...