一、map的插入和遍历
题目描述
请从输入数据中读取n个同学的姓名和年龄,使用map进行存储,接着按照姓名字典序从小到大的顺序输出所有同学的姓名和年龄。
输入格式
第1行一个整数n,代表有n个同学(1 <=n <=10^5)
第2行到第n+1行,每行一个学生的姓名name( < 30个字符 )和年龄age (10 <=age <=20),姓名和年龄之间用空格分隔。
输入数据保证没有重名的学生。
输出格式
按照姓名的字典序从小到大输出n行,每行一个学生的姓名和年龄,姓名和年龄之间用空格分隔。
输入输出样例
输入样例1:
3 Alex 15 Simba 20 Owen 15输出样例1:
Alex 15 Owen 15 Simba 20【耗时限制】1000ms 【内存限制】64MB
思路:
姓名与年龄一一对应,将姓名与年龄作为一个键值对丢入map中,遍历输出即可。
问题: 姓名和年龄,谁作为key,谁作为value?
答案: 按照姓名字典序排序输出。map会针对key进行去重排序,将姓名作为key,年龄作为value
#include<iostream>
#include<map>
#include<cmath>
#include<stack>
using namespace std;
map<string,long long> dict;
map<string,long long>::iterator it;
int main(){
long long n,age;
cin>>n;
string name;
for(int i=1;i<=n;i++){
cin>>name>>age;
dict[name]=age;
}
for(it=dict.begin();it!=dict.end();it++){//遍历
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
--------------------------------------------------------分割线----------------------------------------------------------------
二、map的查询操作
题目描述
输入n个用户的姓名和电话号码,接着进行m次查询操作,每次操作给定两个空格分隔的整数c x,其中c∈[1, 3],具体含义如下:
1 name: 如果用户名name存在则输出name的电话,否则输出NO。
2 name:输出用户名字典序小于name且距离name最近的用户的电话,如果不存在输NO。
3 name:输出首个用户名字典序大于name的用户的电话,如果不存在输出NO。
输入格式
第1行:两个空格分隔的整数,分别表示n和m。
接下来n行:每行两个用空格分隔的字符串,分别表示用户的姓名和电话号码。接下来m行:每行一条指令,含义和题目表述中一致。
输出格式
m行,每个查询的结果输出一行。
输入输出样例
输入样例1:
3 3 alex 13888888888 simba 13988888888 owen 18888888888 1 simba 2 alex 3 alex输出样例1:
13988888888 NO 1 8888888888说明
1 <= n, m <= 10000; 用户名是不超过30个字符的字符串,电话是包含11个数字且首字符不为0的字符串。
输入数据保证用户名和电话都不存在重复。
【耗时限制】1000ms 【内存限制】64MB
思考:
Q: 如何在map中查找关键字?
A: dict.find(key):返回值为key的元素的迭代器,不存在返回end() dict.count(key):返回set中 key的数量,存在返回1,不存在返回0
Q: 如何找到小于x且与x最接近的元素值?
A:如果x存在,此时x的下界是它本身位置,那么答案是下界的前一个元素;
如果x不存在,此时下界为首个大于x的元素位置,答案仍是x的下界前一个元素;
如果下界为s.begin(),说明没有比x小的元素,此时输出NO。
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
map<string,long long> dict;
map<string,long long>::iterator it;
int main(){
long long n,m,num,cmd;
string name,s;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>name>>num;
dict[name]=num;
}
while(m--){
cin>>cmd>>s;
if(cmd==1){
if(dict.find(s)!=dict.end()){
cout<<dict[s]<<endl;
}
else cout<<"NO\n";
}
if(cmd==2){
it=dict.lower_bound(s);
if(it!=dict.begin()){
it--;
cout<<it->second<<endl;
}
else cout<<"NO\n";
}
if(cmd==3){
it=dict.upper_bound(s);
if(it!=dict.end()){
cout<<it->second<<endl;
}
else cout<<"NO\n";
}
}
return 0;
}