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源码--序列式容器的更多相关文章

  1. STL学习笔记--序列式容器

    1.vector vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.故可以将vector看作动态数组. 在创建一个vector后,它会自动在内存中分配一块连续的内存空间 ...

  2. STL源码剖析—顺序容器

    一.vector 1.vector简介: vector的数据安排及其操作方式与数组非常相似,微小的差别在于空间的使用,数组是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的 ...

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

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

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

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

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

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

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

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

  7. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

  8. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

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

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

随机推荐

  1. HRS(CRLF Injection)

    [HRS(CRLF Injection)] CRLF是”回车 + 换行”(\r\n)的简称.在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CR ...

  2. Angularjs学习笔记(四)----与后端服务器通信

    一.使用$http进行XHR和JSONP请求 1.1 XHR请求 GET:$http.get(url,config) POST:$http.post(url,data,config) PUT:$htt ...

  3. Altium Designer XX 重新定义板框形状和大小的方法

    Altium Designer15 重新定义板框形状和大小的方法:重新定义板框形状和大小的方法.很简单,点击数字键"1",就会看到板框界面变绿了这时候你在去点击菜单栏里的Desig ...

  4. (转载)IE6支持透明PNG图片解决方案:DD_belatedPNG.js

    DD_belatedPNG.js 是一个能是IE6支持p显示ng透明图片,而且还支持背景循环(background-repeat)和定位(backgrond-position) ,支持focus,Ho ...

  5. 检测是否IE浏览器

    function browserIsIE(){ if (window.ActiveXObject) return true; else{ var u_agent = navigator.userAge ...

  6. greendao对SQLite数据库的增删改查操作

    利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...

  7. POJ3061 尺取法

    题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...

  8. ArcEngine:The XY domain on the spatial reference is not set or invalid错误

    在创建数据集的时候,提示The XY domain on the spatial reference is not set or invalid错误. 原因:未设置空间参考(ISpatialRefer ...

  9. 小tip:CSS vw让overflow:auto页面滚动条出现时不跳动

    原文地址:http://www.zhangxinxu.com/wordpress/?p=4552 一.水平居中布局与滚动条跳动的千年难题 当前web届,绝大多数的页面间布局都是水平居中布局,主体定个宽 ...

  10. sk_buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...