map笔记
当前没有测试数据。
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
C++ map 基础使用课堂笔记
一、map 核心概念
map 是C++ STL中的关联式容器,核心实现键值对(key - value) 映射关系:
- 键(key):唯一标识,不可重复,map会自动按键升序排序
- 值(value):键对应的数据,可重复
- 类比场景:身份证号(键)→ 姓名(值)、用户名(键)→ 分数(值)
头文件:单独使用需包含 <map>,代码中#include<bits/stdc++.h>是万能头文件,已包含所有STL头文件。
命名空间:示例中使用using namespace std;,否则需写std::map。
二、map 容器定义
语法:map<键的类型, 值的类型> 容器名;
键和值的类型可以是int、string等基本数据类型,需保证键类型支持比较(如string、int默认支持)。
// 键为int类型,值为int类型的map
map<int, int> m;
// 键为string类型,值为int类型的map
map<string, int> m2;
三、map 核心操作(重点)
以下操作均基于示例中的map<string, int> m2;和map<int, int> m;讲解。
1. 赋值:通过 [] 直接赋值
语法:容器名[键] = 值;
- 若键已存在:覆盖原有对应的值
- 若键不存在:自动插入该键值对
// 向m2中插入键"zhaohuanjin",对应值12
m2["zhaohuanjin"] = 12;
// 若再次赋值,会覆盖原有值:m2["zhaohuanjin"]最终为20
m2["zhaohuanjin"] = 20;
2. 查询:通过 [] 访问值
语法:容器名[键];
// 查询键"zhangxuanyi"对应的值,输出到控制台
cout << m2["zhangxuanyi"];
⚠️ 重要坑点:如果访问不存在的键,map会自动插入该键,并给值赋对应类型的默认值(int默认0、string默认空串)。
3. 清空:clear() 方法
语法:容器名.clear();
作用:清空map中所有的键值对,容器变为空。
m2.clear(); // 清空m2的所有数据
cout << m2["zhangxuanyi"]; // 因键被清空,访问时自动插入,输出默认值0
4. 遍历:范围for + auto(C++11及以上)
map会按键自动升序排序,遍历结果为有序序列,推荐使用auto自动类型推导简化代码。
(1)仅遍历读取(不可修改值)
// x为键,y为值,auto自动识别为对应的数据类型
for (auto [x, y] : m2) {
cout << x << " " << y << endl;
}
(2)遍历并修改值(加引用&)
m[3] = 10;
m[2] = 2;
// 加&表示引用,修改y会直接修改map中对应的值
for (auto &[x, y] : m) {
y = 1234; // 所有值被修改为1234
}
m[2] = 4; // 单独修改键2的值,最终为4
cout << m[2] << " " << m[3]; // 输出:4 1234
5. 判断键是否存在:count() 方法(解决[]查询的坑)
语法:容器名.count(键);
- 返回值:0 或 1(因map的键唯一,不存在重复键)
- 返回1:键存在
- 返回0:键不存在
- 核心优势:仅判断存在性,不会自动插入新键,是判断键是否存在的标准方法。
// 判断键"zhangxuanyi"是否存在
if (m2.count("zhangxuanyi") == 0) {
cout << "zhangxuanyi灭绝了"; // 不存在,执行此分支
} else {
cout << "zhangxuanyi还没有灭绝"; // 存在,执行此分支
}
四、map 重要特性
- 键的唯一性:同一个map中,键只能出现一次,重复赋值会覆盖原有值。
- 自动排序:map会根据键的大小自动升序排序(int按数值、string按字典序)。
- 值可修改:通过
[]或遍历加引用&,可以修改键对应的值,键不可修改。
五、完整示例代码(带注释)
#include<bits/stdc++.h>
using namespace std;
// 定义map容器:键值对映射
map<int, int> m; // 键int,值int
map<string, int> m2; // 键string,值int
int main(){
// 1. 赋值:[]直接赋值
m2["zhaohuanjin"] = 12;
// m2["zhangxuanyi"] = 1200000;
// 2. 查询:[]访问值(注意:访问不存在的键会自动插入)
// cout<< m2["zhangxuanyi"];
// 3. 清空:clear()清空所有键值对
// m2.clear();
// cout<<m2["zhangxuanyi"]; // 输出0,因自动插入新键
// 4. 遍历map:auto自动识别类型,map按键自动升序排序
// for(auto [x,y]:m2){ // 仅读取
// cout<<x<<" "<<y<<endl;
// }
// m[3]=10;
// m[2]=2;
// for(auto &[x,y]:m){ // 加&可修改值
// y=1234;
// }
// m[2]=4; // 单独修改,覆盖之前的1234
// cout<<m[2] <<" 听课不认真的zxy "<<m[3]; // 输出4 1234
// 5. 判断键是否存在:count(),返回0不存在,返回1存在
if(m2.count("zhangxuanyi")==0){
cout<<"zhangxuanyi灭绝了";
}else{
cout<<"zhangxuanyi还没有灭绝";
}
return 0;
}
运行结果:zhangxuanyi灭绝了(因代码中未给该键赋值,count返回0)。
六、核心易错点总结
- 避免直接用
[]判断键是否存在,会自动插入新键,必须用count()。 - 遍历修改值时,必须给
auto加引用&,否则仅修改临时变量,不影响原map。 - map的键不可重复,重复赋值会覆盖,若需允许重复键,使用
multimap(后续学习)。