题133.pat甲级练习-1022 Digital Library (30 分)(注意输入问题)
一、题目
二、题解
本题难度不大,活用map和set存数据,查数据就好,但是注意输入问题!!!
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<string,set<string>> m[6];//用map数组来存储不同查找索引的信息,key为查找索引,val为对应的所有id
int N;
cin>>N;
for(int i=0; i<N; i++)
{
string id,title,author,keywords,publisher,year;
//不用getchar()处理
cin>>id;
getchar();//读cin输入之后的回车,避免getline读入
getline(cin,title);
//不用getchar()处理
getline(cin,author);
getline(cin,keywords);
getline(cin,publisher);
cin>>year;
m[1][title].insert(id);
m[2][author].insert(id);
m[3][keywords].insert(id);
m[4][publisher].insert(id);
m[5][year].insert(id);
}
int M;
cin>>M;
for(int i=0; i<M; i++)
{
int index;
scanf("%d: ",&index);
string key;
getline(cin,key);
printf("%d: ",index);
cout<<key<<endl;
if(index==3)
{
set<string> s;
for(auto it=m[index].begin(); it!=m[index].end(); it++)
{
if(it->first.find(key)!=-1)//关键字查找,只要keywords含有输入的key就好
{
for(auto it0=it->second.begin(); it0!=it->second.end(); it0++)//因为输出要从小到大,所以转存在另一个set,原来是来自不同的set,满足不了从小到大
{
s.insert(*it0);
}
}
}
if(s.size()==0)
{
cout<<"Not Found"<<endl;
}
else
{
for(auto it0=s.begin(); it0!=s.end(); it0++)
{
cout<<*it0<<endl;
}
}
}
else if(m[index].find(key)==m[index].end())//其他查找直接用map,找不到为==.end()
{
cout<<"Not Found"<<endl;
}
else
{
for(auto it0=m[index][key].begin(); it0!=m[index][key].end(); it0++)
{
cout<<*it0<<endl;
}
}
}
}
tip:
1.当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
2.getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’