C++ STL学习之关联容器
1.关联式容器定义
所谓的关联式容器,就是有一对键值对(key-value),然后容器中的元素按照键值根据某种确定的规则自动排序。
2.各种树型数据结构对比
(1)二叉树:任何节点最多只允许两个节点
(2)最大(小)堆:父节点大于(或小于)子节点,完全二叉树
(3)二叉搜索树(BST):左子树小于父节点,右子树大于父节点。因此,从根节点一直往左走,走到无路可走就是最小值,同理得最大值
(4)AVL树:是二叉搜索树,要求任何节点的左右字树高度最多相差1.单旋转用于解决外侧插入的情况(拎起根节点的左子节点);双旋转(两次单旋转)则用于解决内侧插入的情况
[单旋转]
[双旋转]
(5)红黑树(RB-Tree):
满足的条件:首先是一颗二叉搜索树
1.每个节点不是红色就是黑色
2.根节点为黑色
3.如果节点为红色,则子节点必须是黑色
4.任一节点至NULL的任何路径,所含的黑节点数必须相同。
注:AVL树和RB树都是在二叉搜索树的基础上,从不同角度定义平衡条件而实现的,主要的调整操作是单旋转和双旋转来解决不平衡的问题。
构建:当新节点根据二叉搜索树的规则到达其插入点的时候却未能符合RB树的条件,则必须调整颜色并旋转树型。
3.红黑树实现
(1)红黑树的节点包括:vaule、color、left指针、right指针和parent指针
(2)SGI STL的红黑树实现是通过双层节点结构和双层迭代器结构实现的,有利于增大弹性。
(3)RB-Tree的迭代器的前进和后退操作完全依赖二叉搜索树的节点排列法则,与红黑无关。即前进操作就是找到排序规则的下一个数;而后退操作则是找到按照排序规则的前一个数。
4.红黑树的构造和内存管理
(1)RB-Tree构造的两种方式:复制或者构造空的:构造一个头结点,使其左右指针指向自己,并使其颜色为red
5. set实现
(1)特性:set只有一组值(既是键值也是实值),set会根据元素的键值自动排序(有序的),不允许有重复元素。注意:set的迭代器是常量迭代器,并不能通过迭代器改变set的值
(2)set以re-tree为底层实现机制
6. map实现
(1)stl pair:一对键值对的数据机构
(2)map的所有元素都是pair,所有元素会根据键值自动排序
(3)map的迭代器不可以改变map的键值,但是可以修改map的实值。
(4)map的底层机制也是rb-tree
注意:set和map都不允许有重复的键值,所以插入操作都是调用rb-tree的insert_unique来实现的。
7. multiset和multimap实现
(1)multiset与set唯一差别是它允许键值重复,因此其插入操作采用的是rb-tree的insert_equal实现
(2)multimap与map唯一差别是它允许键值重复,因此其插入操作采用的是rb-tree的insert_equal实现
8. hashtable
(1)提出的动机:为了解决无限大数组的问题,将元素映射在某个可接受的范围之内,通过hash 函数解决映射问题。
(2)hash表实现过程中的问题及解决方法:碰撞问题(线性探测和二次探测(N+12,N+22),开链),注意,SGI STL的hashtable实现为开链方法。
(3)hashtable的数据结构:vector + 单链表
9. hashset(hashmultiset)、hashmap(hashmultimap)
(1)以hashtable为底层机制;set有自动排序功能而哈数set没有。
(2)hashset使用方式与set完全相同