C++ Map
C++ Map
Map 儲存“鍵/值”對的元素。
Map 中的元素
- 可以透過鍵(而不是索引)訪問,每個鍵都是唯一的。
- 按鍵的升序自動排序。
要使用 Map,您必須包含 <map>
標頭檔案
// 包含 map 庫
#include <map>
建立 Map
要建立 Map,請使用 map
關鍵字,並在尖括號 <>
中指定鍵和值的**型別**。最後,指定 Map 的名稱,例如:map<keytype, valuetype> mapName
示例
// 建立一個名為 people 的 Map,它將儲存字串作為鍵,整數作為值
map<string, int> people
如果您想在宣告時就新增元素,請將它們放在花括號 {}
中,用逗號分隔的列表中
示例
// 建立一個 Map 來儲存不同人的姓名和年齡
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
訪問 Map
您無法像訪問 陣列和 向量那樣,透過索引號來訪問 Map 元素。
相反,您可以透過方括號 []
中的鍵來訪問 Map 元素
示例
// 建立一個 Map 來儲存不同人的姓名和年齡
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 獲取與鍵“John”關聯的值
cout << "John is: " << people["John"] << "\n";
// 獲取與鍵“Adele”關聯的值
cout << "Adele is: " << people["Adele"] << "\n";
自己動手試一試 »
您還可以使用 .at()
函式訪問元素
示例
// 建立一個 Map 來儲存不同人的姓名和年齡
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 獲取與鍵“Adele”關聯的值
cout << "Adele is: " << people.at("Adele") << "\n";
// 獲取與鍵“Bo”關聯的值
cout << "Bo is: " << people.at("Bo") << "\n";
自己動手試一試 »
注意:.at()
函式通常比方括號 []
更受歡迎,因為它會在元素不存在時丟擲錯誤訊息
示例
// 建立一個 Map 來儲存不同人的姓名和年齡
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 嘗試訪問一個不存在的元素(將丟擲異常)
cout << people.at("Jenny");
自己動手試一試 »
更改值
您還可以更改與鍵關聯的值
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 將 John 的值從 32 更改為 50
people["John"] = 50;
cout << "John is: " << people["John"]; // 現在輸出 John is: 50
自己動手試一試 »
但是,使用 .at()
函式更安全
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 將 John 的值從 32 更改為 50
people.at("John") = 50;
cout << "John is: " << people.at("John"); // 現在輸出 John is: 50
自己動手試一試 »
新增元素
要向 Map 新增元素,使用方括號 []
是可以的
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 新增新元素
people["Jenny"] = 22;
people["Liam"] = 24;
people["Kasper"] = 20;
people["Anja"] = 30;
自己動手試一試 »
但您也可以使用 .insert()
函式
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 新增新元素
people.insert({"Jenny", 22});
people.insert({"Liam", 24});
people.insert({"Kasper", 20});
people.insert({"Anja", 30});
自己動手試一試 »
具有相同鍵的元素
Map 不能包含鍵相同的元素。
例如,如果我們嘗試將“Jenny”新增到 Map 兩次,它只會保留第一個
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 嘗試新增兩個鍵相同的元素
people.insert({"Jenny", 22});
people.insert({"Jenny", 30});
自己動手試一試 »
總結:值可以相同,但鍵必須唯一。
移除元素
要從 Map 中移除特定元素,可以使用 .erase()
函式
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 按鍵移除元素
people.erase("John");
自己動手試一試 »
要移除 Set 中的所有元素,可以使用 .clear()
函式
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
// 移除所有元素
people.clear();
獲取 Map 的大小
要找出 Map 包含多少個元素,請使用 .size()
函式
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.size(); // 輸出 3
自己動手試一試 »
檢查 Map 是否為空
使用 .empty()
函式來檢視 Map 是否為空。
.empty()
函式在 Map 為空時返回 1
(true),否則返回 0
(false)
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.empty(); // 輸出 0 (不為空)
自己動手試一試 »
注意:您還可以透過使用 .count(key)
函式來檢查特定元素是否存在。
如果元素存在,它返回 1
(true),否則返回 0
(false)
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
cout << people.count("John"); // 輸出 1 (John 存在)
自己動手試一試 »
遍歷 Map
您可以使用 **for-each** 迴圈遍歷 Map。但是,有幾點需要注意
- 您應該在
for
迴圈中使用auto
關鍵字(在 C++11 版本中引入)。這允許編譯器自動確定每個鍵值對的正確資料型別。 - 由於 Map 元素包含鍵和值,您必須在迴圈中使用
.first
來訪問鍵,並使用.second
來訪問值。 - Map 中的元素按鍵的升序自動排序
示例
map<string, int> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
cout << person.first << " is: " << person.second << "\n";
}
輸出將是:
Adele is: 45
Bo is: 29
John is: 32
如果您想反轉順序,可以在尖括號中使用 greater<type>
仿函式,如下所示
示例
map<string, int, greater<string>> people = { {"John", 32}, {"Adele", 45}, {"Bo", 29} };
for (auto person : people) {
cout << person.first << " is: " << person.second << "\n";
}
輸出將是:
John is: 32
Bo is: 29
Adele is: 45
提示:也可以使用 迭代器遍歷 Map,這將在下一章中詳細介紹。