- 关联容器分类:set还是map、关键字是否重复、关键字是否有序。
11.1 使用关联容器
- map类型通常被称为关联数组,通过关键字充当下标来查找值。set就是关键字的简单集合,当只想知道一个值是否存在时,set是最有用的。
11.2.2 关键字类型的要求
- 有序容器:关键字类型必须定义了比较方法,默认情况下使用<运算符,可自定义一个严格弱序。在集合类型中,关键字类型就是元素类型,在映射类型中,关键字类型是元素的第一部分的类型。
- 严格弱序:不能同时“小于等于”对方;“小于等于”具有传递性;双方都不“小于等于”对方称为“等价”,“等价”具有传递性。
11.2.3 pair类型
- pair类型:可用花括号包围的初始化器来返回pair类型的对象,老版本只允许显式构造。
11.3 关联容器操作
11.3.1 关联容器迭代器
- 关联容器迭代器:map的value_type是pair<const key_type, mapped_type>,所以map迭代器只能改变关键字映射的值,不能修改关键字;set的value_type等于key_type,都是const关键字,不能修改。
11.3.2 添加元素
- 关联容器insert:只有当关键字不存在时才插入,函数返回一个pair,包含一个指向元素的迭代器,和一个指示是否插入成功的bool型。
- 关联容器的insert成员向容器中添加一个元素或一个元素范围。insert的两个版本,分别接受一对迭代器,或者一个初始化器列表。
- 对一个map进行insert操作时,元素类型必须是一个pair。
11.3.3 删除元素
- 关联容器erase:通过传递给erase一个迭代器或一个迭代器对来删除一个元素或一个元素范围。还可以传入一个key_type参数,删除所有匹配给定关键字的元素,并返回被删除的元素数量。
11.3.4 map的下标操作
- map的下标操作:map下标操作返回mapped_type,解引用map迭代器返回value_type;若关键字还不存在,会创建一个对应关键字且值为0的新元素,已存在则返回最近一次赋的值;只能用于map和unorders_map。
11.3.5 访问元素
- 查找元素:find(第一个等于的迭代器)、count(数量)、lower_bound(第一个大于等于的迭代器)、upper_bound(第一个大于的迭代器)、equal_range(返回一个迭代器pair,表示所有相等的头及尾后位置)
11.4 无需容器
- 无序关联容器:使用关键字的哈希函数和==运算符;不能直接定义关键字类型为自定义类类型的无序容器,必须提供自己的hash模板版本,或者用另一种方法,类似于有序容器重载关键字类型的默认比较操作
- 管理桶:无序容器在存储上组织为一组桶,每个桶保存哈希值相同的若干元素;无序容器的性能依赖于哈希函数的质量和桶的数量及大小;管理桶的函数包括桶接口、桶迭代、哈希策略。`