11.1 使用关联容器
分类
有序容器
- map
- set
- multimap
- multiset
无序容器
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
注:set只储存key,map储存key/value,有multi前缀的key可重复。
map的基本使用
经常使用下标运算符访问map中的值,下标为键。当map中并未存在对应键时,则下标运算符会创建一个新元素,其键为下标值,并为其初始化。set的基本操作
经常使用find函数来确认是否存在对应键。
11.2 关联容器概述
顺序容器中的很多操作,包括位置操作、插入操作等,对关联容器没有意义,因此也不被关联容器支持。
初始化关联容器方式与顺序容器类似,既可以列表初始化,也可以拷
注:对非multi前缀的关联容器,初始化时会自动过滤重复键(键值对)
关键字必须严格弱序,在定义关联容器时,可以指定自定义的比较函数,例如
bool compare(const A& a1, const A& a2){...}
multiset<A, decltype(compareA)*> set1(compare);
其中比较操作类型为函数指针。
pair类型
头文件:utility
访问权限:public
成员:first、second
创建方式:
- 括号初始化或列表初始化
- make_pair(v1,v2)
- pair
11.3 关联容器操作
类型别名(通过域操作符使用)
- key_type:键类型
- mapped_type:值类型
- value_type:对于set为键类型,对于map为pair类型;
注:map的value_type所生成的pair,其键类型为const类型。
迭代器
无论是否为const迭代器,都不可以改变键;
常用inserter插入值或对;泛型算法
- 一般使用关联容器自带的find算法。
- 通过inserter来将关联容器作为一个目的位置。
不存在copy(c.begin(),v.end(),back_inserter(c))。
删除:实参为键或迭代器
下标
注:关联容器的下标返回类型与解引用迭代器返回类型不同。下标返回mapped_type,而解引用返回value_type。
find与count
- 可以避免下标带来的键增加;
- 利用关联容器中,键相同的元素相邻存储的特性,可以结合find与count,利用迭代器遍历同键元素。
注:通过lower_bound和upper_bound迭代器也可以实现相似操作。
11.4 无序容器
- 组织方式:哈希函数和==运算符
- 有序容器与无序容器可以实现相互转化;
- 存储方式:桶(性能依赖于哈希函数及桶的数量和大小);
- 生成哈希值
- 使用hash类型对象生成
- 标准库为内置类型定义了hash模板
- 自定义类型需要提供自己的hash模板
//未重载 == 运算符
unordered_multiset<Class, decltype(hasher)*, decltype(eqOp)*>;
//重载了 == 运算符
unordered_multiset<Class, decltype(hasher)*>;