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) 查找,但无序)。











