C/C++

C++ 程式語言 std::map 儲存鍵值對應用法教學與範例

介紹如何在 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;
}
Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago