题解 P5266 【【深基17.例6】学籍管理】
众所周知,map是个好东西
可能好多萌新们都在好奇map是个啥,那这里,我先介绍一下map(如果你懂map的基本操作,请跳过这部分)
政治老师说:研究问题要分三方面:是什么、为什么、怎么做,那咱就从这三个方面说说map的操作吧!
1.什么是map?
map是一种描述“对应关系”的存储结构,就像函数一样
如果你没学函数,你也可以把map理解成下标是任何类型的数组
for example:
map <string ,int> a; //定义map
这就是定义了一个string到int对应的map,也就是说,它的“自变量”为string类型,“函数值”为int类型,对于每一个string,就有一个int类型的值与之对应
然后就可以往map里面塞东西了,注意它的“下标”是一个string
a["wyxniubi"]=1; //赋值
cout<<a["wyxniubi"]; //调用,此时输出1
还是拿函数的例子:此时的"自变量x"="wyxniubi","函数值y"=1
2.为啥要用map?
这个题通过审题可以发现,每一个string的学号对应一个int的分数,这样的话,这题简直就是为map量身定制的啊
其实很多字符串题中map都能派上用场。说句题外话:当数据范围非常大时,map也可以当桶排序中的“桶”来用,效果也是棒呆了
当然,map也是有缺点的,单次操作它的时间复杂度是O(lg n),有时候会TLE
3.怎样用map?
除了刚才介绍的定义和赋值,像string一样,map也有好多好用的成员函数,这里先教大家几个简单的、实用的、这个题能用到的:
| a.count(x) | 判断x为下标的元素是不是在a中,是就返回1,不是就返回0 |
| a.erase(x) | 删除a中x为下标的元素 |
| a.size() | 返回a中元素的个数 |
| a.clear() | 清空a |
这些成员函数都不难,如果不理解,待会看看代码就能懂了
map介绍完了,接下来就是愉快的编代码时间了。因为分4种操作,我们可以用switch语句来编写,注意一定要在最后加break,一定要在最后加break,一定要在最后加break,重要的事情说三遍,其它的就是怎么用map的那些成员函数了
Code:
#include<iostream>
#include<cstring>
#include<map>//要用map嘛......你懂的
using namespace std;
map <string,int> a; //定义一个string(姓名)到int(分数)的map
int main(){
int n;
cin>>n; //n条操作
for(int i=1;i<=n;i++){
int op; //操作种类1234
string name; //学生姓名
cin>>op; //输入操作种类
if(op!=4) //如果不是操作4就输入学生名字
cin>>name;
switch(op){ //开始了!
case 1: //操作1:加入或修改学生
int score; //这个操作需要输入分数
cin>>score;
a[name]=score; //map的对应关系,把名字和分数对应起来
cout<<"OK\n"; //根据题目要求输出OK
break; //别忘了加break!!!
case 2: //操作2:查询学生
if(a.count(name)) //如果找得到
cout<<a[name]<<endl; //输出对应的分数
else cout<<"Not found\n"; //否则"Not Found"
break; //别忘了加break!!!
case 3: //操作3:删除学生
if(a.count(name)){ //如果找得到
a.erase(name); //那就删了它
cout<<"Deleted successfully\n"; //成功删除
}
else cout<<"Not found\n"; //否则"Not Found"
break; //别忘了加break!!!
case 4: //操作4:学生人数
cout<<a.size()<<endl; //输出元素个数就好啦
}
}
return 0; //这个不用解释了吧
}
静待红名