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. AOP (Aspect-OrientedProgramming)面向切面编程

    AOP OOP 面向对象编程 适合自上向下,却不适合自左向右 AOP把软件系统分为两个部分:核心关注点和横切关注点.业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点. 横切关注点的一个特 ...

  2. ios面试技巧

    一.软件开发流程? 软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以及编写.提交程序. 1 相关系统分析员和用户初步了解需 ...

  3. 图解 classpath

    先引用几句网上流传的话: 首先 classpath是指 WEB-INF文件夹下的classes目录 classpath 和 classpath* 区别: classpath:只会到你指定的class路 ...

  4. Xcode LaunchImage 载入界面大小设置

    iPhone Portrait iOS 8-Retina HD 5.5 (1242×2208) @3xiPhone Portrait iOS 8-Retina HD 4.7 (750×1334) @2 ...

  5. 使用QRCode生成二维码

    第一步: 获取QRCode组件 可以通过vs的nuget管理安装Gma.QrCodeNet, 也可以直接添加"Gma.QrCodeNet.Encoding.dll"的引用. 第二步 ...

  6. arduino编程语言Wiring参考手册API

    对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(based on Processing)来实现的. 通过编程,Arduino可以实现很多种功能. ...

  7. Codeforces Round #385 //再遇状压

    敲完三题挂机一小时.....  也没懂DE什么意思  rank600上了一波分... A. Hongcow Learns the Cyclic Shift 给一个字符串,每次可以把最后一个字符拿到开头 ...

  8. RPC学习----Thrift快速入门和Java简单示例

    一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...

  9. Python之字符串小代码解析

    本篇只是拿一段代码来对python中的字符串的一些使用做解释,来让大家更加了解python Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25: ...

  10. 发送短信MFMessageComposeViewController

    if([MFMessageComposeViewController canSendText]) { MFMessageComposeViewController * controller = [[M ...