STL 源码剖析:5、关联式容器


标准的STL关联式容器分为 set 和 map 两大类,以及这两大类的衍生体 multiset 和 multimap。这些容器的底层机制均以 RB-tree 完成。RB-tree 也是一个独立容器,但并不开放给外界使用。

此外,SGI STL 还提供了一个不在标准规格之列的关联式容器:hash table,以及以此 hash table为底层机制而完成的 hash_set、hash_ map、hash_multiset、hash_multimap。



5.1 树的导览


几乎所有的操作系统都将文件存放在树状结构里;几乎所有的编译器都需要实现一个表达式树;文件压缩所用的哈夫曼算法需要用到树状结构;数据库所使用的 B-tree 则是一种相当复杂的树状结构。

5.1.1 二叉搜索树

可提供对数时间的元素插入与访问。

5.1.2 平衡二叉搜索树

也许因为输入不够随机,也许因为经过某些插入或删除操作,二叉树可能会失去平衡,造成效率低落的情况。

5.1.3 AVL tree

AVL tree 是一个 “加上了额外平衡条件” 的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为 O(logN)。

5.1.4 单旋转

解决外侧插入造成的不平衡。

5.1.5 双旋转

解决内侧插入造成的不平衡。



5.2 RB-tree


每个节点不是红色就是黑色。
根节点为黑色。
如果节点为红,其子节点必须为黑。
任一节点至 NULL 的任何路径,所含之黑节点数必须相同。

5.2.1 插入节点

根据 X 的插入位置及外围节点的颜色,有了四种考虑。

5.2.2 一个由上而下的程序

假设新增节点为A,那么就沿着 A 的路径,只要看到有某节点 X 的两个子节点皆为红色,就把 X 改为红色,并把两个子节点改为黑色。

5.2.3 RB-tree 的节点设计

5.2.4 RB-tree 的迭代器

前进和后退操作均调用基层迭代器。

5.2.5 RB-tree 的数据结构

5.2.6 RB-tree 的构造与内存管理

5.2.7 RB-tree 的元素操作

RB-tree 提供两种插入操作:insert_unique() 和 insert_equal()。



5.3 set


set 的特性是,所有元素会根据元素的键值自动被排序。



5.4 map


map 的特性是,所有元素会根据元素的键值自动被排序。



5.5 multiset


multiset 的特性及用法和 set 完全相同,唯一差别在于它允许键值重复。



5.6 multimap


multimap 的特性及用法和 map 完全相同,唯一差别在于它允许键值重复。



5.7 hash table


hash table 在插入、删除、搜寻等操作上也具有 “常数平均时间” 的表现,而且这种表现是以统计为基础,不需仰赖输入元素的随机性。

5.7.1 hash table 概述

hash table 可提供对任何有名项的存取操作和删除操作。

使用 hash table 可能会带来一个问题:不同的元素被映射到相同的位置。

解决碰撞的方法:线性探测、二次探测、开链,等。

5.7.2 hash table 的桶子与节点

buckets 聚合体,以 vector 完成,以便有动态扩充能力。

5.7.3 hash table 的迭代器

hash table 的迭代器没有后退操作,也没有所谓的逆向迭代器。

5.7.4 hash table 的数据结构

5.7.5 hash table 的构造与内存管理

5.7.6 hash table 运用实例

5.7.7 hash functions



5.8 hash_set


几乎所有的 hash_set 操作行为,都只是转调用 hash table 的操作行为而已。
hash_set 的使用方式,与 set 完全相同。



5.9 hash_map


几乎所有的 hash_map 操作行为,都只是转调用 hash table 的操作行为而已。
hash_map的使用方式,与 map 完全相同。



5.10 hash_multiset


hash_multiset 的特性与 multiset 完全相同,唯一差别在于它的底层机制是 hash table。也因此,hash_multiset 的元素不会被自动排序。



5.11 hash_multimap


hash_multimap 的特性与 multimap 完全相同,唯一差别在于它的底层机制是 hash table。也因此,hash_multimap 的元素不会被自动排序。



猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/102865686