一、上期回顾
掌握 set/multiset:底层红黑树、自动排序、元素唯一 / 可重复、只能迭代器遍历。今天学map/multimap,真正工程开发用得最多的键值对容器。
二、map 核心概念
- map:存储
key-value键值对 - 底层依旧红黑树
- key 唯一、自动按 key 升序排序
- key 不可重复,value 可以重复
- 增删查效率O(logn)
三、map 与 multimap 区别
- map:key 唯一,不允许重复键
- multimap:允许重复 key,同一个键可以对应多个 value
日常开发99% 只用 map。
四、map 常用构造初始化
#include <iostream> #include <map> #include <string> using namespace std; int main() { // 1. 空map map<int, string> m1; // 2. 直接初始化键值对 map<int, string> m2 = { {1, "张三"}, {2, "李四"}, {3, "王五"} }; // 3. 拷贝构造 map<int, string> m3(m2); return 0; }五、map 插入数据四种方式
map<int, string> m; // 方式1:[] 下标插入/修改 m[1] = "张三"; m[2] = "李四"; // 方式2:insert 插入pair m.insert(pair<int, string>(3, "王五")); // 方式3:insert 直接大括号 m.insert({4, "赵六"}); // 方式4:value_type m.insert(map<int, string>::value_type(5, "孙七"));注意:
m[key]如果 key 不存在,自动插入默认值- insert 遇到重复 key不会覆盖
六、map 遍历方式
map<int, string> m = {{1,"A"},{2,"B"},{3,"C"}}; // 1. 迭代器遍历 for(map<int, string>::iterator it = m.begin(); it != m.end(); ++it) { // it->first 键,it->second 值 cout << it->first << " " << it->second << endl; } // 2. C++11 范围for for(auto& p : m) { cout << p.first << " " << p.second << endl; }七、map 常用核心接口
map<int, string> m; // 大小、判空 m.size(); m.empty(); // 查找key auto it = m.find(2); if(it != m.end()) { cout << it->second << endl; } // 删除 m.erase(it); // 按迭代器删 m.erase(3); // 按键删除 // 清空 m.clear();八、multimap 简单了解
允许同一个 key 保存多个 value,不支持 [] 下标访问
multimap<int, string> mm; mm.insert({1, "语文"}); mm.insert({1, "数学"}); mm.insert({2, "英语"});适合一个键对应多条记录的场景。
九、完整综合示例代码
#include <iostream> #include <map> #include <string> using namespace std; int main() { map<int, string> stu; // 插入数据 stu[1001] = "张三"; stu[1002] = "李四"; stu.insert({1003, "王五"}); // 遍历 cout << "map遍历结果:" << endl; for(auto& p : stu) { cout << "学号:" << p.first << " 姓名:" << p.second << endl; } // 查找 auto it = stu.find(1002); if(it != stu.end()) { cout << "查到学生:" << it->second << endl; // 删除 stu.erase(it); } cout << "删除后遍历:" << endl; for(auto& p : stu) { cout << p.first << " " << p.second << endl; } return 0; }十、今日核心总结
- map 底层红黑树,键值对存储、key 自动升序
- map key 唯一;multimap 允许 key 重复
- 四种插入方式,[] 会自动补默认值,insert 不覆盖
- 遍历用迭代器 / 范围 for,
first取键,second取值 - 常用接口:find /erase/size /clear
- 项目开发配置、映射关系首选 map
十一、课后练习
- 用 map 存 3 个学号 + 姓名
- 查找指定学号,存在则删除
- 遍历输出所有键值对