前言:
最近在忙活LaTeX的排版学习,就没怎么太注重练习编程。一听到九月一开学就考试,一下子方了。于是练几道题,在这里写个方方日记,记录胆颤惊心的暑假。
题源
分析:
- 还是一个map的练习题目。这个题目,我觉得基本就将map运用到很好的水平了。是一个将string映射到set<int>的map,也就是
map<string,set<int>>
所以只需要稍加思考怎么建立这个map就可以。
2.对于第一点的补充,在这里我需要指出,
七位ID信息,使用int即可保存。
其余信息一律使用string保存。
因为作者信息,出版商信息分别都是自己的string保存的,所以要建立string到set<int>映射,有几个string就得建几个map。
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<set>
using namespace std;
map<string,set<int>> mpTitle,mpAuthor,mpKey,mpPub,mpYear;//强调一嘴,变量的名称使用小驼峰的命名规则。
void query(map<string,set<int>> &mp , string & str)//map的传递参数比较慢,所以我们这里使用引用
{
if(mp.find(str) == mp.end()) //not find
{
printf("Not Found\n");
}
else
{
for(set<int>:: iterator it =mp[str].begin() ; it != mp[str].end() ; it++)
{
printf("%07d\n",*it);//将对应的集合内容一并打印
}
}
}
int main()
{
int N ;//记录书本个数
int Q;//记录测试用例
int ID;//存储ID
string bookTitle,author,key,pub,year;
scanf("%d",&N);
for(int i = 0 ; i< N ; i++)
{
scanf("%d",&ID);
char c = getchar();//ID输入完之后会有一个回车符,但是下面紧接着就要用到getline了,所以中间需要一个getchar接一下这个\n
getline(cin , bookTitle);
mpTitle[bookTitle].insert(ID);
getline(cin,author);
mpAuthor[author].insert(ID);
string key;
while(cin>>key)
{
mpKey[key].insert(ID);
c = getchar();
if(c == '\n')
{
break;
}
}
getline(cin,pub);
mpPub[pub].insert(ID);
getline(cin,year);
mpYear[year].insert(ID);
}
string question;
int type;
scanf("%d",&Q);
while(Q--)
{
scanf("%d: ",&type);
getline(cin,question);
cout<<type<<": "<<question<<endl; //注意string只能cout输出
if(type==1)
{
query(mpTitle,question);
}else if(type == 2)
{
query(mpAuthor,question);
}else if (type ==3 )
{
query(mpKey,question);
}else if (type == 4)
{
query(mpPub,question);
}else if(type == 5)
{
query(mpYear,question);
}
}
return 0;
}
总结:
总体上没什么技巧可言。只是这个map的映射到容器set的用法值得注意,吸收和学习。
map<string,set<int>>
使用背景是:当发现是一对多的时候,而且还要求“多”的元素以顺序排列,可以考虑这个map<T ,set<N>>