我们可以用下标访问顺序容器的元素,也就是说在顺序容器实现中下标和元素的值相关联。那么能不能让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。
前言
让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。
常见的关联容器
1. map:也即关联数组,是键 - 值的集合
2. set:纯键的集合
3. multimap:map容器的“ 一键对多值 “版本
4. multiset:set容器的” 一键对多值 “版本
关联容器的特性
1. 下标访问不存在将导致容器中增加一个新的元素。
2. 可以使用count和find函数对键进行检索操作(这个特性说明可以把键看成索引)。
map容器使用范例
下面这个程序是一个微型的电话簿。该程序从当前目录载入电话簿存档文件,允许用户通过姓名在电话簿中查找其对应的电话号码并告知用户。示例电话簿文件如下:
源代码:
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4 #include <map>
5
6 using namespace std;
7
8 int main()
9 {
10 cout << "请输入电话簿存档文件名: ";
11 string filename;
12 cin >> filename;
13
14 /*
15 * 打开文件
16 */
17 fstream io;
18 io.open(filename.c_str());
19 if (!io) {
20 cout << "打开存档文件失败!" << endl;
21 return 1;
22 }
23
24 /*
25 * 将电话簿存至map容器
26 */
27 map<string, string> telbook;
28 string name;
29 string tel;
30 while (io >> name) {
31 io >> tel;
32 // 注意这里下标使用的编程意义
33 telbook[name] = tel;
34 }
35 // 记得关闭流
36 io.close();
37 cout << "电话簿文件载入完毕" << endl;
38
39 /*
40 * 获取查询对象并返回查询结果
41 */
42 map<string, string>::iterator it;
43 while (1) {
44 cout << "请输入查询对象( 输入#退出 ): " << endl;
45 cin >> name;
46 if (name == "#") break;
47 // 检索操作
48 it = telbook.find(name);
49 if (it!=telbook.end())
50 cout << "查找结果: " << it->second << endl << endl;
51 else
52 cout << "找不到任何记录" << endl << endl;
53 }
54
55 return 0;
56 }
运行结果:
说明
纯键。
2. multimap和multiset需要注意的地方是那个find函数,我将在下篇随笔中详细讲解。