关联容器map(二)练习讲解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值