c++ map容器如何使用 键值对的插入、查找和删除【教程】

map 是基于红黑树的有序关联容器,键唯一且自动升序;支持 operator[]、insert()、emplace() 插入;查找推荐用 find(),避免 operator[] 意外插入;删除用 erase();遍历用范围 for 循环。

map 是 C++ 标准库中常用的关联容器,底层通常基于红黑树实现,自动按键(key)升序排序,支持高效查找、插入和删除,时间复杂度均为 O(log n)。它存储的是键值对(key-value pairs),且每个键唯一。

插入键值对

有多种方式向 map 插入元素,常用方法包括:

  • operator[]:用键作为下标赋值,若键不存在则自动构造默认值并插入;若已存在,则覆盖对应 value。
    例如:myMap["apple"] = 5; —— 若 "apple" 不存在,插入 {"apple", 5};若已存在,则将 value 改为 5。
  • insert():更安全的插入方式,不会覆盖已有键,返回一个 pair,second 表示是否插入成功。
    例如:auto ret = myMap.insert({"banana", 3});ret.second 为 true 表示新插入,false 表示键已存在。
  • emplace():就地构造键值对,避免临时对象拷贝,效率略高(尤其对大对象)。
    例如:myMap.emplace("cherry", 7);

查找键对应的值

查找操作不改变容器,主要有以下几种方式:

  • operator[]:最简写法,但注意——若键不存在,会自动插入该键并赋予 value 默认值(如 int 为 0),这可能不是你想要的行为。
  • at():带边界检查,若键不存在抛出 std::out_of_range 异常,适合需要严格校验的场景。
    例如:int count = myMap.at("apple");
  • find():推荐方式。返回迭代器,若找到则指向对应键值对,否则等于 end()
    例如:auto it = myMap.find("apple"); if (it != myMap.end()) { cout second; }

删除指定键或范围

删除操作通过 erase() 完成,有三种重载形式:

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

  • erase(key):直接传入键,删除该键对应元素,返回删除的元素个数(0 或 1)。
  • erase(iterator):删除指定迭代器位置的元素,返回下一个有效迭代器(可用于循环中安全删除)。
  • erase(first, last):删除 [first, last) 范围内的所有元素(较少用于 map,因 key 有序,多用于子范围清理)。

遍历与注意事项

map 支持基于范围的 for 循环:

for (const auto& kv : myMap) { cout

注意点:

  • 键类型必须支持 比较(默认用 std::less),自定义类需重载 operator 或提供比较函数。
  • map 中的 key 不可修改(因为会影响排序结构),如需修改,应先 erase 再 insert。
  • 若只需哈希查找且不关心顺序,可考虑 unordered_map(平均 O(1) 查找,但无序)。