C++笔记——STL map
在 C STL 中map是有序键值对key-value关联容器它的核心特点是键唯一、自动排序、高效查找是开发中处理映射关系如字典、配置、索引最常用的容器之一。这篇笔记会从核心特性、头文件、常用操作、底层原理、适用场景、避坑指南全面掌握map。一、map 核心特性必记存储结构以键值对pairkey, value为单元存储。键的规则键key唯一不可重复值value可重复。排序规则默认按照键key升序排序底层红黑树自动排序。访问方式支持通过键快速访问值map[key]。底层实现红黑树平衡二叉搜索树。效率查找、插入、删除O(log n)对数时间效率极高。与 unordered_map 区别map有序底层红黑树查找 / 插入稳定。unordered_map无序底层哈希表查找更快O (1)。二、必备头文件使用map必须包含以下头文件#include map // map 核心头文件 #include iostream using namespace std;三、map 常用操作完整代码示例1. 定义与初始化map模板参数mapkey类型, value类型// 1. 空map mapint, string m1; // 2. 初始化列表C11及以上 mapint, string m2 {{1, 张三}, {2, 李四}, {3, 王五}}; // 3. 拷贝初始化 mapint, string m3(m2);2. 插入元素4 种常用方式map插入会自动去重、自动排序。mapint, string m; // 方式1[] 赋值最简单若键已存在则覆盖值 m[1] 张三; m[2] 李四; // 方式2insert pair推荐键已存在则插入失败不覆盖 m.insert(pairint, string(3, 王五)); // 方式3insert make_pair简化版 m.insert(make_pair(4, 赵六)); // 方式4emplaceC11直接构造效率最高 m.emplace(5, 孙七);3. 访问元素mapint, string m {{1, 张三}, {2, 李四}}; // 方式1[] 访问键不存在会自动插入默认值 cout m[1] endl; // 输出张三 // 方式2at() 访问键不存在会抛异常更安全 cout m.at(2) endl; // 输出李四 // 方式3通过迭代器访问 auto it m.find(1); if (it ! m.end()) { cout it-first it-second endl; // first键second值 }4. 查找元素最常用find(key)找到返回迭代器没找到返回end()。mapint, string m {{1, 张三}, {2, 李四}}; // 查找键为 2 的元素 auto it m.find(2); if (it ! m.end()) { cout 找到 it-second endl; } else { cout 未找到 endl; } // 统计键的个数map 键唯一结果只有 0 或 1 cout m.count(1) endl; // 输出 15. 删除元素mapint, string m {{1, 张三}, {2, 李四}, {3, 王五}}; // 方式1按键删除 m.erase(2); // 删除键为 2 的元素 // 方式2按迭代器删除 auto it m.find(3); m.erase(it); // 方式3清空所有元素 m.clear();6. 容量操作mapint, string m {{1, 张三}, {2, 李四}}; // 获取元素个数 cout m.size() endl; // 输出 2 // 判断是否为空 cout m.empty() endl; // 输出 0false7. 遍历元素3 种方式mapint, string m {{1, 张三}, {2, 李四}, {3, 王五}}; // 方式1迭代器遍历 for (auto it m.begin(); it ! m.end(); it) { cout it-first it-second endl; } // 方式2范围for最简洁推荐 for (auto p : m) { // p 是 pairint, string cout p.first p.second endl; } // 方式3auto 结构化绑定C17最优雅 for (auto [key, val] : m) { cout key val endl; }8. 自定义排序改变默认升序默认map按键升序可改为降序// 降序 map mapint, string, greaterint m {{1, 张三}, {2, 李四}};四、map 底层原理map底层是红黑树一种自平衡二叉搜索树所有元素按照键key排序。插入 / 删除 / 查找都能保持树平衡效率稳定在O(log n)。因为是红黑树迭代器遍历是有序的。五、适用场景优先使用map的场景需要键值映射如 ID→姓名、单词→解释、配置项→值。需要按键有序遍历。需要高效查找、插入、删除百万级数据无压力。不建议使用map的场景追求极致查找速度 → 用unordered_map哈希表。键允许重复 → 用multimap。六、常见坑点避坑指南键不能重复重复插入同一个键insert 会失败[] 会覆盖值。[] 访问危险使用m[key]时如果key 不存在会自动插入默认值。迭代器失效map插入 / 删除操作除被删除节点外其他迭代器都不失效。排序只看键map只根据key排序与 value 无关。不能修改键键it-first是只读的修改会破坏红黑树结构。总结map是有序、键唯一的键值对容器底层红黑树。核心操作[]访问、insert插入、find查找、erase删除。查找 / 插入 / 删除效率O(log n)。适用需要映射关系 有序 稳定效率的场景。与unordered_map互补有序用map极速查找用unordered_map。