关联容器: map
2023年12月26日 2023年12月28日
关键字到值的映射
键值对
key-value
标准库类型 pair
. map容器的元素类型
关键字起到索引的作用, 值则表示与索引关联的数据
pair类型拥有两个数据成员:
- 定义pair类型对象时, 需提供这两个数据成员的类型
- 均为公有数据成员, 程序员可直接使用
头文件
1#include <utility>
定义pair类型对象
- 默认初始化
默认构造函数对数据成员进行值初始化
1pair<T1, T2> p;
- 列表初始化
1pair<T1, T2> p = {v1, v2};
- 直接初始化
两个成员分别用v1和v2初始化
1pair<T1, T2> p(v1, v2);
- 使用make_pair操作构造pair对象
1make_pair(v1, v2); // 返回一个用v1和v2初始化的pair对象. pair的类型根据v1和v2的类型进行推断
示例
1pair<string, string> anon; // 两个空字符串 2pair<string, size_t> word_count; // 空字符串 + 0 3pair<string, vector<int>> line; // 一个空字符串和一个空vector 4 5pair<string, string> author{"James", "Joyce"};
访问pair公有数据成员
- map系列关联容器使用first存放关键字, 使用second存放值
- map系列的first成员具有顶层const
1p.first; 2p.second;
比较pair对象
-
判断pair对象相等/不等
1p1 == p2; 2// <= (p1.first == p2.first && p1.second == p2.second) 3 4p1 != p2; 5// 利用(p1 == p2)实现 6// <= !(p1 == p2)
-
比较pair对象大小
只使用小于运算符1p1 < p2; 2// <= (p1.first < p2.first) 或者 !(p2.first < p1.first) && p1.second < p2.second)
示例: pair作为函数返回类型
如果容器不为空, 返回最后一个元素及其长度; 返回空串和0
1pair<string, int> process(vector <string> &v) 2{ 3 // 处理v 4 5 if (!v.empty()) 6 return {(v.back(), v.back().size()}; // 列表初始化 7 else 8 return pair<string, int>(); // 构造返回值 9 10// return pair<string, int>((v.back(), v.back().size()); 11// return make_pair(v.back(), v.back().size()); 12}
map的关键字类型
如果两个关键字等价, 其对应同一个元素; 我们可以用任意一个关键字来访问对应的值
比较键值对里的关键字
- 只使用小于运算符
- 如果(p2.first < p1.first)不成立,(p1.first < p2.first)必成立
(p1.first < p2.first)为真 <=> !(p2.first < p1.first)为真
定义map
需给出元素键值对类型
1map<T1, T2> m; // 元素类型为pair<const T1, T2>
元素的关键字不可修改
创建空容器
1map<string, size_t> word_count;
列表初始化
1map<string, string> authors = { {"Joyce", "James"}, 2 {"Austen", "Jane"}, 3 {"Dickens", "Charles"} };
遍历map, 得到pair类型元素
1for (const auto &author : authors) 2 cout << author.first << "/t" << author.second << endl;