【博览网】C++标准库——第三周课程笔记

来源:互联网 发布:软件设计师考试经验 编辑:程序博客网 时间:2024/05/28 05:17

本周还是接着上一周的内容,介绍容器的底层设计。本周介绍的容器为deque及stack、queue,rbtree及set、multiset、map、multimap,hashtable及unorder容器。

一、deque及stack、queue
1.deque容器
deque容器是一个前后都可以进行扩展的容器。在设计上,为了实现前后扩展的效率,deque没有向vector那样只是简单的预留了扩展空间,deque采取了更为特殊的设计方法。
这里写图片描述
上图十分清晰的展示了deque的底层结构,deque底层定义了一个map空间,用来存储指向每个buffer段的指针。每个buffer的大小在deque中是固定的,在deque前后扩展的时候,如果buffer中的空间用完了,那么就使用map再申请一块buffer进行扩展,这样deque就可以避免过于频繁的空间申请。
deque的结构比较特殊,致使deque的迭代器也必须要有比较特殊的设计。因为deque在逻辑上是一个连续的、两段可以扩充的容器,因此deque必须支持随机迭代器。所以,如上图所示,deque的迭代存了4个数据内容,分别为cur、first、last、node。cur为当前位置元素的指针,first和last为当前buffer的begin和end指针,node则指向map中当前buffer指针所处的位置。当迭代器需要移动到当前buffer之外的区域时,便可以利用node指针快速定位到对应buffer,然后计算出对应buffer上的对应位置。
2.stack和queue
stack和queue是非常常用的数据结构,前者为先进后出的栈,后者为先进先出的队列。由于这两种数据结构的接口较为简单,因此可以借助其他容器实现,并将容器的接口改造为所需接口,因此二者在本质上是一种容器配适器。在STL中,二者默认的底层容器为deque,下图展现了三者之间的关系。
这里写图片描述
需要说明的是,stack和queue不提供便利功能,也不提供iterator。

二、rb_tree及set、multiset、map、multimap
1.rb_tree
rb_tree,即红黑树,是一种经典的平衡的二叉搜索树,在STL中,红黑树是需要实现快速查找的数据结构的set/multiset、map/multimap的底层结构。红黑树有以下几个特点:
• 红黑树是一种平衡的二分搜索树
• 红黑树的排列规则有利于search和insert
• 红黑树提供遍历操作及iterator
• 按照正常规则(++ite)便利红黑树,便可以获得已排序的元素序列
红黑树中树的结点数据为value,value数据包含key和data。在使用红黑树时,需要提供key和value的类型,以及从value中获取key,比较key大小的方法。但是不需要提供获取data的方法。因此,在使用红黑树时,应该小心,不要使用迭代器改变key的值。
关于红黑树的实现原理和底层细节比较复杂,这里就不作详细介绍。需要了解相关知识可以参考《STL源码解析》和这篇博客:教你初步了解红黑树
2.set/multiset容器
set/multiset是key和value合一的rb_tree,所以,其本质上也是一种容器配适器。需要注意的是,set/multiset在设计时保证了key值不能通过iterator改变,实现方法为直接将迭代器定义为rb_tree的const iterator。
3.map/multimap容器
map/multimap本质上就是就是红黑树,只是为了安全性,其对红黑树又进行了一层封装,使得iterator只能修改data而不能修改key。其实现方式是使用pair