第十二篇:实用的关联容器
前言
我们可以用下标访问顺序容器的元素,也就是说在顺序容器实现中下标和元素的值相关联。那么能不能让别的值(而不是下标)与元素的值相关联呢?有的,实现这种功能的容器就叫做关联容器,而关联的本质就是某个特定的“键”与元素的值相关联。
常见的关联容器
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 }
运行结果:
说明
1. set容器的基本操作和map基本相同,只是其元素为纯键。
2. multimap和multiset需要注意的地方是那个find函数,我将在下篇随笔中详细讲解。