题目
您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过条):
- 插入与修改,格式
1 NAME SCORE
:在系统中插入姓名为NAME(由字母和数字组成不超过20个字符的字符串,区分大小写) ,分数为SCORE(0<SCORE<) 的学生。如果已经有同名的学生则更新这名学生的成绩为 SCORE。如果成功插入或者修改则输出OK
。 - 查询,格式
2 NAME
:在系统中查询姓名为NAME的学生的成绩。如果没能找到这名学生则输出Not found
,否则输出该生成绩。 - 删除,格式
3 NAME
:在系统中删除姓名为NAME的学生信息。如果没能找到这名学生则输出Not found
,否则输出Deleted successfully
。 - 汇总,格式
4
:输出系统中学生数量。
输入输出样例
输入样例
5
1 lxl 10
2 lxl
3 lxl
2 lxl
4
输出样例
OK
10
Deleted successfully
Not found
0
解析
这样的学籍管理系统也是一个集合,但是功能比较复杂--需要根据索引找到对应的元素,并对元素进行操作。可以通过调用STL库里面的map来解决这个问题。
map关联集合的本质也是一棵红黑树,可以看作一个下标可以是任意类型的数组。其头文件是map,可以调用map实现如下几个基本功能。
(1)map<A,B> ds:建立一个名字叫做ds,下标类型为A,元素类型为B的映射表,例如map<string,int>就是一个将string映射到int的映射表。
(2)ds[A]=B:把这个”数组”中下标为A的位置的值变成B,这里下标可以是任意类型,不一定限定为大于0的整数,比如map<string,string>ds,就可以进行ds["kkksc03"]="mascot"的操作。
(3)ds[A]:访问这个“数组”中下标为A的元素,比如可以进行cout<<ds["kkksc03"]<<endl;这样的操作。
(4)ds.end():返回映射表中最后一个元素的下一个元素的地址。
(5)ds.find(x):查询x在映射表中的地址,如果这个数不存在,则返回ds.end()。
(6)ds.empty():如果集合是空的,则返回1,否则返回0。
(7)ds.size():返回映射表中的元素个数
(8)ds.erase(A):删除这个”数组”中下标为A的元素。
注意:在使用ds[A]访问“数组”下标为A的元素时,如果这个下标对应的元素不存在,则会自动创建下标为A,值为默认值的元素。
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int n,opt,num;
string name;
map<string,int> ds;
int main(){
cin>>n;
while(n--){
cin>>opt;
if(opt==1){
cin>>name>>num;
ds[name]=num;//这里对映射表name所对应的值修改为num
cout<<"OK"<<endl;
}
else if(opt==2){
cin>>name;
if(ds.find(name)!=ds.end()){
cout<<ds[name]<<endl;
}
else{
cout<<"Not found"<<endl;
}
}
else if(opt==3){
cin>>name;
if(ds.find(name)!=ds.end()){
ds.erase(ds.find(name));
cout<<"Deleted successfully"<<endl;
}
else{
cout<<"Not found"<<endl;
}
}
else{
cout<<ds.size()<<endl;
}
}
return 0;
}