【1022】Digital Library(map)

举报
野猪佩奇996 发表于 2022/01/23 00:15:30 2022/01/23
【摘要】 1.题目 https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336 给出N本书的编号、书名、作者关键词、...

1.题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336
给出N本书的编号、书名、作者关键词、出版社及出版年份,然后根据某个除编号外的信息来查询所有满足该信息的书的编号,并要求按编号从小到大顺序输出。

2.思路

map<string,set<int>>分别建立书名、作者、关键词、出版社及出版年份与编号的map映射,
——map<string,set<int>> mpTitle,mpAuthor,mpKey,mpPub,mpYear;
关键词的逐个提取:每本书都可能有多个关键词,需要将这些关键词分离开——用cin来读入单个关键词,然后用getchar接收在这个关键词后面的字符:如果是换行符,则说明关键词的输入结束;如果是空格,则继续读入。
——因为cin读入字符串是以空格或者换行为截止标志的,至于书名、作者、出版社及出版年份则是作为整体读入,因此用getline来读入整行。
PS:有点奇葩的是在用scanf读取书的ID后要加getchar来读掉换行符(虽然scanf是以换行符或空格作为结束标志的,但如果是ID后是空格,此时后面的换行符会被下面的getline读入,导致后面读取错误)。

while(cin>>key){//每次读入单个关键词key
	mpKey[key].insert(id);//把id加入到key对应的集合中
	c=getchar();//接收关键词key之后的字符
	if(c=='\n') break;//如果是换行,说明关键词输入结束
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

3.代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>  
#include<map>
#include <set>
using namespace std; 
 
//key:map<string,set<int>>
 
//5个map变量分别建立书名、作者、关键字、出版社及出版年份与id的映射关系
map<string,set<int>> mpTitle,mpAuthor,mpKey,mpPub,mpYear;
 
void query(map<string,set<int>>& mp,string& str){ //在mp中查找str
	if(mp.find(str) == mp.end())  printf("Not Found\n"); //找不到
	else{  //找到str
		for(set<int>::iterator it=mp[str].begin() ; it!=mp[str].end();it++){
			printf("%07d\n",*it); //输出str对应的所有id
		}
	}
}   
int main(){   
	int n,m,id,type;
	string title,author,key,pub,year;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&id);  //id
		char c=getchar(); //接收掉id后面的换行!虽然前面scanf以换行结束
		getline(cin,title);  //读入书名titile
		mpTitle[title].insert(id); //把id加入titile对应的集合中
		getline(cin,author);
		mpAuthor[author].insert(id); //把id加入author对应的集合中
		while(cin >> key){ //每次读入!单个!关键词key
			mpKey[key].insert(id);  //把id加入key对应的集合中
			c=getchar(); //接收关键词key之后的字符
			if(c == '\n')  break;  //如果是换行,说明关键词输入结束
		}
		getline(cin,pub);  //输入出版社pub
		mpPub[pub].insert(id);  //把id加入pub对应的集合中
		getline(cin,year);  //输入年份year
		mpYear[year].insert(id);  //把id加入year对应的集合中
	}
	string temp;  //查询次数
	scanf("%d",&m);  
	for(int i=0;i<m;i++){
		scanf("%d: ",&type);  //查询类型
		//注意读上面的数字后scanf结束
		getline(cin,temp);
		cout << type <<": "<<temp<<endl;  //输出类型和该字符串
		if(type==1) query(mpTitle,temp); //查询书名对应的所有id
		else if(type == 2) query(mpAuthor,temp);  //作者
		else if(type == 3) query(mpKey,temp);  //关键字
		else if(type == 4) query(mpPub,temp);  //出版社
		else query(mpYear,temp);
	}
	system("pause");
    return 0;   
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

4.注意

(1)如果单独把查询操作作为一个函数,则一定要对参数使用引用&,否则最后一组数组会超时。字符串以及map的参数传递速度较慢——如果需要作为函数的参数,最好加上引用。
(2)在scanf或cin输出书的编号id后,必须用getchar接收掉后面的空格,否则getline会将还将换行读入。

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/112503878

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。