我们可以用下标访问顺序容器的元素,也就是说在顺序容器实现中下标和元素的值相关联。那么能不能让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。

前言

让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。

常见的关联容器

       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 }

       运行结果:

       

多个 容器 相互 二个容器底部相连_多个 容器 相互_02

说明

纯键。

       2. multimap和multiset需要注意的地方是那个find函数,我将在下篇随笔中详细讲解。