傳統陣列/Vector 只能用整數索引。但現實應用常需「字串對應字串」、「字串對應數值」等非整數索引場景:
C++ STL <map> 提供鍵值對關聯容器,鍵可為任意可比較型別。
關聯兩個元素:first(鍵)、second(值)
#include <utility>
#include <string>
pair<string, string> prof_and_course("Jones", "Syntax");
pair<int, string> symbolic_const(0, "false");
// 輔助函數
make_pair(prof, course); // 回傳 pair<string,string>
#include <map>
#include <string>
map<string, string> addresses;
// 插入元素
addresses["Paul W."] = "paul@mail.com";
// 相同鍵賦值不會覆蓋原值
addresses["Paul W."] = "newaddr@com.net"; // 無效
typedef map<string, string>::const_iterator CIT;
CIT cit = addresses.find("Paul W.");
if (cit == addresses.end())
cout << "sorry, no such key" << endl;
else
cout << cit->first << '\t' << cit->second << endl;
for (CIT p = bonuses.begin(); p != bonuses.end(); ++p)
cout << p->first << '\t' << p->second << endl;
資料檔 bonuses.dat:
Bob 35
Bob 90
Jane 80.25
Sue 100
Jane 65.5
map<string, double> bonuses;
string agent;
double bonus = 0;
ifstream bonusfile("bonuses.dat");
while (bonusfile >> agent >> bonus) {
bonuses[agent] += bonus; // 關鍵:鍵存在則累加,不存在則初始化為 0 再累加
}
// 輸出結果
// Bob 125
// Jane 145.75
// Sue 100
原理:map[key] 回傳值的引用。若鍵不存在,預設建構值(double 為 0.0)。+= 運算子修改該引用指向的值,完成累加。
標準 map 以紅黑樹實作,查找 O(log n)。C++11 引入 unordered_map(雜湊表),平均 O(1) 查找,適合大量資料高效能場景。
Danny Kalev:認證系統分析師、C++ 標準委員會前成員(1997-2000),專攻 C++ 與形式語言理論,定期為 C++ 雜誌撰稿並授課。