第十一章 关联容器
map和multimap定义在头文件map中;
set和multiset定义在头文件set中
无序容器则定义在头文件unordered_map和unordered_set中
11.1 使用关联容器
1、使用map的简单例子
for循环读取map得到的是pair类型
2、使用set的简单例子
map和set是模板,都需要指定元素类型
11.2 关联容器概述
1、关联容器对关键字类型的限制
2、有序容器的关键字类型
满足严格弱序
3、自定义操作的set
需要自己做一个函数,这个函数给出<的定义是什么
3、pair类型
pair定义在头文件utility中
11.3 关联容器操作
1、关联容器额外的类型别名
2、关联容器迭代器
当解引用关联容器迭代器时,得到一个类型为容器的value_type的值的引用。
map的迭代器用例:解引用得到的是pair
set的迭代器用例:注意set不能修改
3、添加元素
这里需要注意emplace的返回值,返回一个pair:
pair里的first是一个迭代器,指向刚插入的元素。
second是一个bool值,指定插入是否成功。
4、删除元素
5、map的下标操作
我们可以像访问数组那样,用关键字(string)当作index来访问map中的值
①、对于map的下标访问
如果原来存在有相应的元素,则更改原来的元素
如果原来没有相应的元素,则添加新元素。
②、map的下标操作返回一个mapped_type对象。并且是一个左值
比如对map<string, int>进行下标访问,需要使用对应的关键字string进行检索,得到的是与之对应的int左值。
③、不能对multimap或一个unordered_multimap进行下标操作
因为这些容器可能有多个值与一个关键字相关联。
6、访问元素
- find如果没有找到,则会返回尾后迭代器。可以用作找没找到的判断条件
- lower_bound和upper_bound两个函数组合起来,就可以获取与指定元素相等的迭代器范围
- multimap和multiset中一个关键字对应多个元素,这些元素在容器中相邻存储。
“根据作者的名字,查找作者的著作”,以这种情况为例综合运用上述方法:
①、find和count的运用
②、lower_bound和upper_bound的运用
结合这两个函数得到与指定值相等的迭代器范围
③、equal_range函数
返回一个pair,存储的迭代器与方法②相同
11.4 无序容器
无序容器使用哈希函数来组织元素,使用无序容器通常更为简单,通常也会有更好的性能。
1、管理桶
使用桶的方法处理哈希函数中可能会出现的碰撞问题
2、无序容器对关键字类型的要求
可以直接定义关键字是内置类型的无序容器
不能直接定义关键字为自定义类型的无序容器