STL之map
STL之map
学籍管理
题目描述
您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过 \(10^5\) 条):
- 插入与修改,格式
1 NAME SCORE
:在系统中插入姓名为 NAME(由字母和数字组成不超过 20 个字符的字符串,区分大小写) ,分数为 \(\texttt{SCORE}\)(\(0<\texttt{SCORE}<2^{31}\)) 的学生。如果已经有同名的学生则更新这名学生的成绩为 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
map
做法
-
常见功能
map<A, B> mp
- 建立一个名字叫
mp
下标类型为A
,元素类型为B
的映射表,例如map<string, int>
就是一个将string
映射到int
的映射表。
- 建立一个名字叫
mp[A] = B
- 把“下标” A 的位置变为 B 。
mp[A]
- 访问下标为 A 的元素。
mp.end()
- 配合其他方法比较
mp.find(x)
- 查询
x
(是下标)在映射表中的地址(查的是下标),如果这个数不存在,返回mp.end
- 查询
mp.erase(X)
- 删除这个“数组”中下表为
A
的元素。
- 删除这个“数组”中下表为
- 如果访问
mp[A]
而该下标对应元素并不存在,会创造一个默认值。
-
代码实现
#include<iostream> #include<algorithm> #include<cstdio> #include<map> std::map<std::string, std::string> mp; std::string name, score; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int n, opt; std::cin >> n; while(n--) { std::cin >> opt; switch(opt) { case 1: { std::cin >> name >> score; mp[name] = score; std::cout << "OK" << std::endl; break; } case 2: { std::cin >> name; if (mp.find(name) != mp.end()) { std::cout << mp[name] << std::endl; } else { std::cout << "Not found\n"; } break; } case 3: { std::cin >> name; if (mp.find(name) != mp.end()) { mp.erase(name); std::cout << "Deleted successfully\n"; } else { std::cout << "Not found\n"; } break; } case 4: { std::cout << mp.size() << std::endl; break; } } } return 0; }