STL源码--序列式容器
1. vector:
vector的内存管理,动态分配内存,不需要程序员来维护存储空间,是与array最大的区别,程序员只需从逻辑上关注代码,而不需要对内部的存储空间的分配和回收分心。首先,vector会分配一个合适的空间给使用者,当不断的产生push_back()等插入操作时,原有空间就不足了,需要增加存储,如果当前的容量小于vector存储的总量,则直接分配下一个位置给新加入的元素,当当前的容量已经达到了vector存储的总量时,则需要重新分配内存。首先vector会从新的内存区申请两倍于当前总量大小的空间,然后将原来的存储的内容复制到新区域的前半段,然后加入新元素,如此,保证相对较少的申请次数,和相对较大的内存空间。注意,一旦引起空间的重新配置,则原指向vector的所有迭代器就都失效了。
2.list:
list类似链表结构,不会浪费存储空间,list是一个双向循环链表,表结构中有个node指向最后一个节点,这样就保证了双向循环链表的各个操作的可用性。list的操作基本和链表操作类似,没有什么特别之处,在此就不在赘述。
3. deque:
与vector类似,deque也是一段连续的线性空间,与vector的区别在于:
1). deque是双向开口的,vector是单向开口的。虽然vector也可以在头尾两端操作,但正如第一部分介绍的,在尾端操作时是向后直接添加元素,在前面加元素时,势必要移动大量元素,因此效率极低。
2). deque没有所谓容量的概念,因为他是动态的增加连续的空间,随时可以增加一段连续空间并链接起来。而不是像vector那样,因空间不足而重新申请空间并复制,再释放原有空间。
3). deque虽然提供随机访问元素,但是迭代器并不是普通指针,效率相对于vector要差很远,因此,能使用vector尽量使用vector,对deque的排序,为了提高效率,可以将deque复制到vector后,进行排序,然后再复制回deque。
deque的数据结构比较复制,使用一个map来维护一个指向缓冲区的指针的表,而缓冲区就是真实的连续的存储空间了。因此迭代器的++或--就显的相当麻烦了。
迭代器示意:
template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator
{
...
T* cur; // 指向所指的缓冲区的当前元素
T* first; // 指向所指缓冲区的头
T* last; // 指向所指缓冲区的尾
map_pointer node; // 指向管控中心
};
4. stack:
stack是先进先出的单出口的结构,底层是以deque实现的,因此stack一般不称为容器,而被称为适配器。另外,stack只能访问栈顶元素,因此不能遍历,没有迭代器。
5. queue:
queue是先进后出的两个出口的结构,底层页是deque实现的,因此queue也是一种适配器,只能进队和出队,不能遍历队列中元素,不具有迭代器。
6. heap:
heap不算是STL容器组件,但是扮演着优先队列的助手。heap底层是vector,vector元素类似数组实现二叉树的结构,形成一个完全二叉树,可以是大根堆,也可以是小根堆。heap是特殊的排列规则,因此也没有迭代器。
7. priority_queue:
默认情况下,priority_queue底层是max_heap实现完成的,这种以底部容器实现的,叫做适配器。priority_queue也和queue类似,只能在顶端进出,因此不能遍历,也没有迭代器。
8. slist:
slist是一个单向链表。它与list的区别主要有:slist的迭代器属于单向型的Forward Iterator, list的迭代器属于双向型的Bidirectional Iterator。slist消耗空间更小,某些操作更快,是另一种优势。slist的插入操作,是极其费事的,因为一般插入操作都是在指定元素前面插入,而slist是单向的,要找到这个元素位置,需要从头遍历,因此,插入是一个缺点。
STL源码--序列式容器的更多相关文章
- STL学习笔记--序列式容器
1.vector vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.故可以将vector看作动态数组. 在创建一个vector后,它会自动在内存中分配一块连续的内存空间 ...
- STL源码剖析—顺序容器
一.vector 1.vector简介: vector的数据安排及其操作方式与数组非常相似,微小的差别在于空间的使用,数组是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的 ...
- STL源码剖析读书笔记--第四章--序列式容器
1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- STL源码剖析——序列式容器#1 Vector
在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...
- STL源码剖析:序列式容器
前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...
- 《STL源码剖析》——第四章、序列容器
1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...
- STL源码分析读书笔记--第5章--关联式容器
1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
随机推荐
- 使用命令行执行webpagetest进行测试
背景 使用webpagetest进行性能分析,需要一个一个url的去执行,需要人为去等,比较繁琐.而api很好的解决了这个问题,可以通过命令行等执行测试,也可以写成一个常规脚本,针对每个版本的常规ur ...
- apache限制同一ip大并发访问及下载
内容来自以下网站整理 http://www.jb51.net/article/58060.htmhttp://www.2cto.com/os/201202/120665.htmlhttp://blog ...
- jquery实现淡入淡出
fade方法包括四个: (1)fadeIn(speed,callback):淡入的方法,speed代表淡入的速度,可以是slow,fast,毫秒,不填等 例如: $(document).ready(f ...
- Ubuntu 15.10搭建IPSec L2TP服务器
以下步骤完全使用于Ubuntu 14.04版本 首先安装以下所需包 sudo apt-get install openswan xl2tpd ppp lsof!注意!Ubuntu 15.10会提示无法 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- ceph与openstack对接
对接分为三种,也就是存储为openstack提供的三类功能1.云盘,就好比我们新加的硬盘2.原本的镜像也放在ceph里,但是我没有选择这种方式,原因是因为后期有要求,但是我会把这个也写出来,大家自己对 ...
- Tomcat中间件URL中文字符传递问题
1. 问题描述: tomcat中如果URL中需要传递中文参数,需要配置tomcat的service.xml中文传递的编码方式,否则中文传递将出现乱码,导致程序异常. 2. 解决方式: 修改tomcat ...
- flash中设置文本字体样式
txt.setTextFormat(tf); txt.defaultTextFormat = tf;
- Miller_Rabin素数测试
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #inclu ...
- UIWebView、WKWebView使用详解及性能分析
http://www.cnblogs.com/junhuawang/p/5759224.html