介紹如何在 C++ 程式中使用標準程式庫的 map 處理鍵值對應(key-value)的資料。
std::map 簡介
C++ 標準函式庫中的 std::map 可以用來儲存一對一鍵值對應的資料,例如姓名對應年紀的資料。
std::map 中的鍵(key)是不可以重複的,例如若要儲存姓名對應年紀的資料,以姓名作為鍵的話,就不可以出現兩個人有相同姓名的狀況。
std::map 內部的資料在存放時是有經過排序的,所以不管是新增或查詢資料的速度都很快(O(log n))。
std::map 基本範例
以下是一個最簡單的 std::map 基本使用範例。
#include <iostream>
#include <map>
using namespace std;
int main() {
// 宣告一個以 string 對應 unsigned int 的 map 變數
map<string, unsigned int> ageTable;
// 新增姓名與年紀的對應
ageTable["Jake"] = 10;
ageTable["Thomas"] = 12;
ageTable["Michael"] = 16;
// 以姓名查詢對應的年紀
cout << "Thomas => " << ageTable["Thomas"] << endl;
// 以迴圈逐一處理 map 中的每個元素
map<string, unsigned int>::iterator it;
for (it = ageTable.begin(); it != ageTable.end(); ++it){
cout << it->first << ": " << it->second << endl;
}
return 0;
}
Thomas => 12 Jake: 10 Michael: 16 Thomas: 12
加入鍵值對應
若要在 std::map 中加入新的鍵值對應,除了使用 [] 運算子之外,也可以使用 insert 函數:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, unsigned int> ageTable;
// 第一種新增鍵值方式
ageTable["Jake"] = 10;
ageTable["Thomas"] = 12;
// 第二種新增鍵值方式
ageTable.insert(pair<string, unsigned int>("Michael", 16));
map<string, unsigned int>::iterator it;
for (it = ageTable.begin(); it != ageTable.end(); ++it){
cout << it->first << ": " << it->second << endl;
}
return 0;
}
Jake: 10 Michael: 16 Thomas: 12
查詢鍵值對應
若要根據鍵(key)來查詢 std::map 中對應的值,除了以 [] 運算子之外,也可以使用 find 函數:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, unsigned int> ageTable;
ageTable["Jake"] = 10;
ageTable["Thomas"] = 12;
ageTable["Michael"] = 16;
// 第一種查詢鍵值方式
cout << "Thomas => " << ageTable["Thomas"] << endl;
cout << "Non-exist => " << ageTable["Non-exist"] << endl; // 不存在的鍵
// 第二種查詢鍵值方式
map<string, unsigned int>::iterator iter = ageTable.find("Thomas");
if (iter != ageTable.end()) {
cout << "Thomas => " << iter->second << endl;
} else {
cout << "Not found." << endl;
}
return 0;
}
Thomas => 12 Non-exist => 0 Thomas => 12
使用 find 函數的話,可以明確區隔出查不到鍵值對應的狀況,所以是比較推薦的方法。
刪除鍵值對應
若要刪除 std::map 中的鍵值對應關係,可以使用 erase 函數:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, unsigned int> ageTable;
ageTable["Jake"] = 10;
ageTable["Thomas"] = 12;
ageTable["Michael"] = 16;
// 以迭代器刪除
map<string, unsigned int>::iterator iter = ageTable.find("Thomas");
ageTable.erase(iter);
// 以鍵刪除,成功刪除傳回 1,否則傳回 0
int n = ageTable.erase("Thomas");
// 以迭代器把整個 map 清空,等同於 ageTable.clear()
ageTable.erase(ageTable.begin(), ageTable.end());
return 0;
}
std::map 元素個數
若要查詢 std::map 內部的元素個數,可以使用 size() 函數,而若要清空整個 std::map,則可使用 clear() 函數,並以 empty() 函數來檢查:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, unsigned int> ageTable;
ageTable["Jake"] = 10;
ageTable["Thomas"] = 12;
ageTable["Michael"] = 16;
// 元素個數
cout << "size = " << ageTable.size() << endl;
// 清空 map
ageTable.clear();
// 檢查 map 是否是空的
if (ageTable.empty()) {
cout << "ageTable is empty." << endl;
}
return 0;
}
