首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

C++ STL <map> 關聯容器完整教學:從基礎到實戰應用

     編輯:關於VC++

什麼是關聯容器?

傳統陣列/Vector 只能用整數索引。但現實應用常需「字串對應字串」、「字串對應數值」等非整數索引場景:

  • 電話簿:姓名 → 電話號碼
  • DNS:域名 → IP 位址
  • 字典、庫存、薪資表等

C++ STL <map> 提供鍵值對關聯容器,鍵可為任意可比較型別。

Pair 與 Map 基礎

std::pair

關聯兩個元素: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>

建立與初始化 Map

#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++ 雜誌撰稿並授課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved