题解 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;  //这个不用解释了吧
}

静待红名