第11章_关联容器
使用关联容器
关联容器概述
- 关联容器中的元素是按关键字来保存和访问的
- 关联容器不支持顺序容器的位置相关的操作
- 关联容器的迭代器都是双向的
定义关联容器
map
set
multimap
multiset
关键字类型的要求
有序容器的关键字类型
- 对于有序容器(map, multimap, set, multiset), 关键字类型必须定义元素的比较方法
- 默认情况下, 标准库使用关键字类型的 < 运算符来比较两个关键字
- 可以提供自己定义的操作来代替关键字上的 < 运算符. 所提供的操作必须在关键字类型上定义一个严格弱序(可以将严格弱序看作小于等于)
- 两个关键字不能同时小于等于对方
- 如果 k1 <= k2, 且 k2 <= k3, 那么 k1 必须 <= k3
- 如果存在两个关键字, 任何一个都不小于等于另一个, 那么这两个关键字等价. 若 k1 等价于 k2, k2 等价于 k3, 那么 k1 等价于 k3
- 在实际编程中, 重要的是, 如果一个类型定义了行为正常的 < 运算符, 则它可以用作关键字类型
pair 类型
- make_pair(v1, v2);
关联容器操作
关联容器迭代器
- 当解引用一个关联容器迭代器时, 会得到一个类型为容器的 value_type 的值的引用.
- 对 map 而言, value_type 是一个 pair 类型, 其 first 成员保存 const 的关键字, second 成员保存值
- set 的迭代器是 const 的
添加元素
删除元素
map 的下标操作
- map 下标运算符接受一个索引, 获取与此关键字相关联的值. 与其他下标运算符不同的是, 如果关键字并不在 map 中, 会为它创建一个元素并插入到 map 中, 关联值将进行值初始化
- map 下标运算符返回一个左值
访问元素
- find
无序容器
- 不是使用比较运算符来组织元素, 而是使用一个哈希函数和关键字类型的 == 运算符
- 无序容器在存储上组织为一组桶, 每个铜保存零个或多个元素
- 默认情况下, 无序容器使用关键字类型的 == 运算符来比较元素, 使用一个 hash
类型的对象来生成每个元素的哈希值(标准库为内置类型提供了 hash 模板) - 直接定义关键字类型为自定义类类型的无序容器时, 需要提供 hash 模板版本和 == 运算符(或者在使用定义无序容器时传入这两种可调用对象)