在 C++ 中使用 STL Map 容器

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用 std::map 来声明一个 map 容器对象
  2. 在 map 中在 C++ 中使用 find 成员函数搜索特定元素
  3. 在 map 中在 C++ 中使用 insert 成员函数存储元素
  4. 在 C++ 中使用 merge 成员函数连接两个 map 对象的元素
在 C++ 中使用 STL Map 容器

本指南将向你展示如何在 C++ 中使用 STL map 容器的几种方法。

在 C++ 中使用 std::map 来声明一个 map 容器对象

std::map 容器实现了一个排序的键值对数据结构,其中键是唯一的。键值默认按升序排列 pair 元素;但是,用户可以选择将比较函数传递给 std::map 模板。你可以使用值列表初始化 map 对象,其中每个元素都在单独的大括号中指定。在这种情况下,我们创建一个 string 对的 map,然后将它的元素打印到 cout 流。请注意,每个元素都作为 for 循环中的 std::pair 成员访问。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  printMap(m1);

  return EXIT_SUCCESS;
}

输出:

11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

在 map 中在 C++ 中使用 find 成员函数搜索特定元素

find 成员函数可用于在 map 容器中查找特定的键值对。查找操作具有对数复杂性。find 函数获取对键的引用,并将迭代器返回到具有等效键的元素。当没有找到具有给定键的元素时,返回一个尾后迭代器。

以下代码片段演示了如何使用范围迭代器初始化新的 map 容器。请注意,第一个迭代器是使用 find 函数检索的。此外,检查返回的迭代器的有效性可能很有用。

#include <cassert>
#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m2(m1.find("11700K"), m1.end());
  printMap(m2);

  auto ret = m1.find("11700K");
  assert(ret != m1.end());
  std::map<string, string> m3(ret, m1.end());
  printMap(m3);

  return EXIT_SUCCESS;
}

输出:

11700K : Core i7;
11900K : Core i9;
1390P : Xeon W;

在 map 中在 C++ 中使用 insert 成员函数存储元素

你可以使用 insert 成员函数向现有的 map 容器添加新元素。insert 成员获取对要添加的对象的引用,并返回一个容器 std::pair,该容器由插入元素的迭代器和指示成功插入状态的 bool 值组成。当插入失败时,迭代器指向阻止操作的元素。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  auto ret1 = m1.insert({"1390P", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }

  ret1 = m1.insert({"1390", "Xeon W"});
  if (!ret1.second) {
    cout << "Not inserted!" << endl;
  }
  printMap(m1);

  return EXIT_SUCCESS;
}

输出:

Not inserted!
11600K : Core i5;
11700K : Core i7;
11900K : Core i9;
1390 : Xeon W;
1390P : Xeon W;

在 C++ 中使用 merge 成员函数连接两个 map 对象的元素

merge 成员函数可用于连接来自两个 Map 容器的元素。它是从需要存储组合元素的 map 对象调用的,并将另一个 map 作为参数。操作后,所有指向传输元素的指针和引用都是有效的。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"11900K", "Core i9"},
      {"11700K", "Core i7"},
      {"11600K", "Core i5"},
      {"1390P", "Xeon W"},
  };

  std::map<string, string> m4 = {
      {"11900KF", "Core i9"}, {"11600T", "Core i5"}, {"11700K", "Core i7"}};

  m1.merge(m4);
  printMap(m1);

  return EXIT_SUCCESS;
}

输出:

11600K : Core i5;
11600T : Core i5;
11700K : Core i7;
11900K : Core i9;
11900KF : Core i9;
1390P : Xeon W;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Map