C++如何使用map?(插入、查找与删除示例)

20次阅读

mapc++ 标准库中基于红黑树实现的关联容器,自动按 key 有序排列,支持快速查找、插入和删除(平均时间复杂度 O(log n)),要求 key 可比较(默认使用 less 比较)。

C++如何使用map?(插入、查找与删除示例)

map 是 C++ 标准库中基于红黑树实现的关联容器,自动按 key 有序排列,支持快速查找、插入和删除(平均时间复杂度 O(log n))。它要求 key 可比较(默认使用

插入元素:operator[] 和 insert

常用两种方式插入键值对

  • operator[]:若 key 不存在则默认构造 value 并插入;若已存在则覆盖 value。适合“写多读少”或需要默认初始化的场景。
  • insert():只在 key 不存在时插入,返回 pair,second 表示是否成功插入。更安全,避免意外覆盖。

示例:

#include  #include  using namespace std;  int main() {     map m;      // 方式1:operator[]     m["apple"] = 10;     // 插入或更新     m["banana"] = 20;      // 方式2:insert()     auto ret1 = m.insert({"cherry", 30});      // 成功,ret1.second 为 true     auto ret2 = m.insert({"apple", 99});       // 失败(key 已存在),ret2.second 为 false      cout << m["apple"] << endl;  // 输出 10(未被 insert 覆盖) }

查找元素:find() 和 operator[] 的区别

查找推荐用 find(),因为它不修改 map,且能区分“key 不存在”和“key 存在但 value 为默认值”:

立即学习C++免费学习笔记(深入)”;

  • find(key) 返回 iterator,等于 end() 表示未找到;安全、高效、语义清晰。
  • operator[](key) 在 key 不存在时会**插入**一个默认构造的 value,改变容器状态,不适合只读查找。

示例:

auto it = m.find("grape"); if (it != m.end()) {     cout << "Found: " << it->first << " = " << it->second << endl; } else {     cout << "Not found" << endl; }

删除元素:erase()

erase() 支持三种调用形式:

  • erase(iterator):删除单个元素(推荐,O(1) 平摊)
  • erase(key):删除指定 key 的元素(返回删除个数,map 中总是 0 或 1)
  • erase(first, last):删除 [first, last) 区间内所有元素

注意:用 iterator 删除后,该 iterator 失效,不要继续使用;但 erase 返回下一个有效 iterator(C++11 起),可用于遍历时安全删除:

// 安全遍历删除满足条件的元素 for (auto it = m.begin(); it != m.end(); ) {     if (it->second < 15) {         it = m.erase(it);  // erase 返回下一个 iterator     } else {         ++it;     } }

其他实用细节

  • map 默认升序排列(用 less),可传自定义比较器,如 map> 实现降序。
  • size() 返回元素个数,empty() 判断是否为空,clear() 清空全部元素。
  • key_type、mapped_type、value_type 是常用类型别名,增强泛型代码可读性

text=ZqhQzanResources