第十二篇:實用的關聯容器

穆晨發表於2017-01-26

前言

       我們可以用下標訪問順序容器的元素,也就是說在順序容器實現中下標和元素的值相關聯。那麼能不能讓別的值(而不是下標)與元素的值相關聯呢?有的,實現這種功能的容器就叫做關聯容器,而關聯的本質就是某個特定的“鍵”與元素的值相關聯。

常見的關聯容器

       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函式,我將在下篇隨筆中詳細講解。

相關文章