在 C++ 中使用 STL 無序對映容器

Jinku Hu 2023年10月12日
  1. 使用 std::unordered_map 元素在 C++ 中宣告一個無序對映容器
  2. 使用 contains 成員函式檢查 C++ 對映中是否存在給定元素
  3. 使用 erase 成員函式從 C++ 中的對映中刪除特定元素
  4. 使用 insert 成員函式在 C++ 中向對映新增新元素
在 C++ 中使用 STL 無序對映容器

本文解釋瞭如何在 C++ 中使用 STL unordered_map 容器的幾種方法。

使用 std::unordered_map 元素在 C++ 中宣告一個無序對映容器

std::unordered_map 元素實現了一個鍵值對的關聯容器,其中每個鍵都是唯一的。與 std::map 不同,std::unordered_map 容器不按排序順序儲存元素。因此,容器主要用於元素查詢,位置無關緊要。此外,不能保證物件生命週期內元素的位置是固定的。因此,程式設計師應該將順序視為未定義。

以下示例演示了 unordered_map 容器的列表初始化,然後輸出兩個對映的內容。請注意,m1 元素的降序並不意味著它們已排序。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  std::map<int, string> m2 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  printMap(m1);
  printMap(m2);

  return EXIT_SUCCESS;
}

輸出:

4 : orange;
3 : grape;
2 : banana;
1 : apple;

1 : apple;
2 : banana;
3 : grape;
4 : orange;

使用 contains 成員函式檢查 C++ 對映中是否存在給定元素

自 C++20 更新以來,contains 成員函式已成為 std::unordered_map 容器的一部分。你可以使用該函式檢查 Map 中是否存在給定元素。此命令接受鍵值作為唯一引數,如果找到鍵,則返回 true。該函式具有恆定的平均執行時間,最壞的情況是線性的,取決於容器本身的大小。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (int x : {1, 2, 3, 4, 5}) {
    if (m1.contains(x)) {
      cout << x << ": Found\n";
    } else {
      cout << x << ": Not found\n";
    }
  }

  return EXIT_SUCCESS;
}

輸出:

1: Found
2: Found
3: Found
4: Found
5: Not found

使用 erase 成員函式從 C++ 中的對映中刪除特定元素

你可以使用 erase 成員函式從 Map 中刪除給定的鍵值對。該函式具有三個過載,第一個將迭代器帶到需要從容器中刪除的 map 元素。第二個函式過載需要兩個迭代器來指定範圍,該範圍將從 Map 中刪除。請注意,給定範圍必須是呼叫容器物件內的有效範圍。第三個過載可以獲取應該刪除的元素的鍵值。

在下面的示例中,我們刪除每個具有偶數作為鍵值的元素。

#include <iostream>
#include <map>
#include <unordered_map>

using std::cout;
using std::endl;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  for (auto it = m1.begin(); it != m1.end();) {
    if (it->first % 2 == 0)
      it = m1.erase(it);
    else
      ++it;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

輸出:

3 : grape;
1 : apple;

使用 insert 成員函式在 C++ 中向對映新增新元素

unordered_map 容器的另一個核心成員函式是 insert 函式,你可以使用它向 Map 新增新元素。該函式有多個過載,但我們使用第一個只接受鍵值對的過載。請注意,我們還使用 std::make_pair 函式來構造具有給定引數值的新對。

#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::unordered_map<int, string> m1 = {
      {1, "apple"},
      {2, "banana"},
      {3, "grape"},
      {4, "orange"},
  };

  vector<string> vec{"papaya", "olive", "melon"};

  auto count = 0;
  for (const auto& item : vec) {
    m1.insert(std::make_pair(count, item));
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

輸出:

0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Map