STL源码剖析笔记-4序列式容器

来源:互联网 发布:windows 10激活 编辑:程序博客网 时间:2024/06/06 10:40

  • 序列式容器
    • 1 容器的概观与分类
    • 2 vector
    • 3 list
    • 4 deque
    • 5 stack
    • 6 queue
    • 7 heap
    • 8 priority_queue
    • 9 slist

4 序列式容器

4.1 容器的概观与分类

  • 序列式容器array、vector、heap、priority-queue、list、slist、deque、stack、queue.
  • 关联式容器RB-tree、set、map、multiset、multimap、hashtable、hash-set、hash_map、hash_multiset、hash_multimap.

4.2 vector

  • vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。
  • vector支持的操作:begin()、end()、size()、capicity()、empty()、operator[]、front()、back()、pop_back()、push_back()、erase()、resize()、clear().
  • vector维护的是一个线性连续空间,其迭代器是普通指针,vector支持随机存取。
  • vector以两个迭代器start和finish分别指向配置来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
  • vector是动态空间,所谓动态增加大小,不是在原空间后接续新空间,而是以原空间大小的两倍另配置一块较大的空间,然后将原内容拷贝过来。
  • 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。
  • 插入操作图示:


4.3 list

  • list的好处是每次插入或删除一个元素,就配置或释放一个元素的空间。因此list对于空间的运用有绝对的精准,而且对于任何位置的元素插入或元素移除,永远是常数时间。
  • list不仅是双向链表,还是环状双向链表,使用一个node空白指针作为表头又作为end。
  • list支持的操作:push_front()、push_back()、erase()、pop_front()、pop_back()、clear()、remove()、unique()、splice()、reverse()、sort()、transfer()、merge().
  • splice()、reverse()、merge()、sort()的实现都依赖于transfer(),它是非公开接口。
  • transfer的图示:

4.4 deque

  • deque与vector的最大差异:一在于deque允许于常数时间内对起头端进行元素的插入或移除,二在于deque没有所谓的capacity概念,它是动态的以分段连续空间组合而成。
  • deque采用一块所谓的map作为主控,map是一小块连续空间,其中每个元素都是指针,指向另一段较大的连续空间,称为缓冲区,缓冲区才是deque的存储空间主体。
  • deque的中控器、迭代器、缓冲区的相互关系:
  • 缓冲区的末尾一定要有保留空间,而前端则可以没有。在无任何元素时,deque会保留一个缓冲区。

4.5 stack

  • stack 是一种先进后出的数据结构,只有一个出口
  • 除了最顶端外,没有任何其他方法存取stack的元素,因此它不允许有遍历行为,无迭代器
  • stack以deque为底层结构,封闭deque头端开口。
  • 支持的操作有empty()、size()、top()、push()、pop().

4.6 queue

  • queue是一种先进先出的数据结构,有两个出口
  • 只能从最底端加入元素,从最顶端取出元素,没有其他方法存取queue的元素,因此不允许遍历,无迭代器
  • 底层结构为deque,封闭deque的底端出口和前端入口。
  • 支持的操作empty()、size()、front()、back()、push()、pop().

4.7 heap

  • heap并不是STL的组件,而是优先队列的底层结构。
  • 二叉堆是一种完全二叉树,即除了底层叶结点外,其他节点都是满的,底层叶结点从左到右也没有空隙。
  • heap以vector来保存数据。
  • STL提供的是max-heap.
  • heap不提供遍历功能,无迭代器。
  • push_heap算法:将新元素放到最后,然后上溯到合适的位置以满足堆特性。
  • pop_heap算法:将根节点与最后一个节点交换,然后把新的根节点下溯到合适位置。
  • sort_heap算法:对每个值都进行pop_heap,每次都把最大值放到最后一个位子,就形成了从小到大的排序。
  • make_heap算法:就是堆排序算法,先使数据成为一个堆,再排序。

4.8 priority_queue

  • 只允许底端加入元素,顶端取出元素,不能遍历,无迭代器
  • 元素不是按照推入的顺序排列,而是按照权值排序
  • 底层结构是max_heap。
  • 支持操作empty()、size()、top()、pop()、push()
  • push()操作底层是先将元素push_back到vector末端,在push_heap排序。
  • pop()操作底层是先pop_heap(),在vector的尾部的值pop_back()。

4.9 slist

  • slist属于单向的Forward Iterator,list是双向的Bidirectional Iterator.
  • slist的插入、移除、聚合等操作不会使原有的迭代器失效
  • 因为STL插入元素是在原位置之前,而slist是单向的,要找到前一个元素只能重新遍历,因此insert、erase等操作属于不智之举。
  • slist不提供push_back(),只提供push_front(),元素次序和插入的次序相反.
  • 提供的操作有:begin()、end()、size()、swap()、front()、push_front()、pop_front()、find()、insert()等.
1 0
原创粉丝点击