STL之map

发布时间 2023-11-27 18:17:21作者: 加固文明幻景

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;
    }