七、关联容器

本章介绍4种关联容器set、map、unordered_set、unordered_map。
1.顺序容器是同构元素在容器中的位置访问元素;关联容器是通过关键字来保存和访问元素。
2.set用于保存关键字;map用于保存键值对,每个键值对都用一个pair类型存储,其中first成员存储关键字,second成员存储值。
3.注意在关联容器中,关键字唯一,即关键字不可重复出现。
(有关键字可重复的关联容器,但在此不介绍)

关联容器概述
关联容器是根据所存储的关键字来保存和访问容器中的元素的。
关联容器可以分为有序关联容器set、map和无序关联容器unordered_set、unordered_map。
有序关联容器的底层数据结构为红黑树,因此查找和访问元素的时间复杂度为O(log n);无序关联容器的底层数据结构为哈希表,查找和访问元素的时间复杂度为O(1)。
关联容器对象的定义和初始化与顺序容器相似。例如:

关联容器共有的操作

map和unordered_map的下标操作
若定义map或unordered_map类型的对象m,则m[k]将返回关键字k的元素对应的值的引用;若关键字k不在m中,则m中会自动添加一个关键字为k的元素,并对其值做值初始化。
因set和unordered_set本身就是存储关键字,因此不支持下标运算符。

有序关联容器的二分查找操作

自定义有序关联容器和priority_queue的关键字/元素比较方法
1.重载小于运算符(同泛型算法章节中介绍的写法)
2.函数对象/仿函数写法(创建有序关联容器时可传递一个函数对象作为参数指定关键字/元素的比较方法)
因为priority_queue是一个容器适配器,需要使用一个底层容器实现,所以第二个参数需要指定实现的底层容器(一般用vector)。
1)函数对象类(重载函数调用运算符,见泛型算法章节)
2)greater和less(例:priority_queue<int,vector<int>,greater<int>>、map<int,int,greater<int>>)

自定义无序关联容器的关键字哈希函数
其中Hash为自定义哈希函数,可以通过编写函数对象类实现哈希函数。如下定义了一个hash(key)=key mod m(m为表长)的哈希函数: