在本篇中,我们将要介绍两个常用的 STL 库中的两个数据结构,set 和 map,这两个函数的底层都是由红黑树实现的。本篇不会实现其底层原理,本篇只会将其其中的要点和使用时应该注意的地方。然后还会介绍关于 set 和 map 的两个扩展容器:multiset 和 multimap。
目录如下:
目录
1. 关联式容器和键值对
关联式容器
对于 STL 容器而言,存在序列式容器,如:vector、list、deque、forward_list等,其底层实现为线性序列数据结构,其中存储是元素本身。
本篇将要介绍是关联式容器 map 和 set,关联式容器也是用来存储数据的,与序列式容器不同的是,其中存储的为 <key, value> 结构的键值对,在数据检索时比序列式容器效率更高。
键值对 pair
在讲解 map 和 set 之前,我们要先介绍一种结构,该结构只包含两种成员变量 key 和 value,key 代表键值, value 代表与 key 对应的关系。其对应关系可以理解为英汉互译的中英文词汇。
SGI-STL中关于键值对的定义:
template <class T1, class T2> struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair() : first(T1()) , second(T2()) {} pair(const T1& a, const T2& b) : first(a) , second(b) {} };
在下文中,我们将要开始介绍两种树形结构的关联式容器 —— map 和 set。
2. set
以下关于 set 的解释来源于:cplusplus.com/reference/set/set/?kw=set
对于 set 的一些特性如下:
1. set 是按照一定次序存储元素的容器;
2. set 中的元素不能被修改,因为是按照顺序存储的树形结构,修改之后很可能会影响其树形特性,我们只能增加和删除元素;
3. 在树形结构内部,set 中的元素总是按照其内部比较对象所指示的特定严格弱排序准则进行排序;
4. set 底层是用二叉搜索树(红黑树)实现。
5. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
6. set 中的元素不会存在相同键值的元素。
set 的使用
关于 set 的使用,对于 set 的模板参数列表如下: