这个题挺好的。学习了map和set的使用,还有字符串的接收和输出。参考了柳神的代码。
题目要求根据title,author,key,publisher,year来输出对应书的编号,思路是建立map<关键码,编号的集合>,关键码就是title,author,key,publisher,year,根据在一堆数据中迅速的根据关键码找到对应信息,且关键码不重复,应该用map。很简单的想法是用数组存储,一个个遍历,比较麻烦且耗时。
将函数的参数设置为引用会节省很多时间,不知道原理是什么,记录一下。可能是因为,在map很大时,如果不设置形参为引用,每次查找将会复制一份map,这应该很花时间(当要查找的次数很多时)。
1 #include <iostream> 2 #include<cstdio> 3 #include<set> 4 #include<map> 5 #include<string> 6 using namespace std; 7 void output(map<string,set<int> > &xx,string &ss,int num){//测试点5,引用做形参节省时间 8 map<string,set<int> >::iterator it = xx.find(ss); 9 printf("%d: ",num); 10 cout<<ss<<endl; 11 if(it==xx.end()) 12 printf("Not Found\n"); 13 else 14 { set<int>::iterator ii=xx[ss].begin(); 15 for(ii=xx[ss].begin();ii!=xx[ss].end();ii++) 16 printf("%07d\n", *ii); //测试点4,5。前面为一串0的编号也要正确输出 17 } 18 } 19 int main() 20 { 21 int n; 22 scanf("%d\n",&n);//注意这个换行符一定不能省略,不然会留在缓冲区造成下面的字符串读取混乱 ,或者不写\n,在下一行用getchar()吸收换行 23 int id; 24 string title,author,key,publisher,year; 25 map<string,set<int> > Title,Author,Key,Publisher,Year; 26 for(int i=0;i<n;i++){ 27 scanf("%d\n",&id);////注意这个换行符一定不能省略,不然会留在缓冲区造成下面的字符串读取混乱,或者不写\n,在下一行用getchar()吸收换行 28 29 getline(cin,title); 30 Title[title].insert(id); 31 32 getline(cin,author); 33 Author[author].insert(id); 34 35 while(cin>>key) { 36 Key[key].insert(id); 37 char c=getchar();//吸收空格和换行 38 if(c==‘\n‘) 39 break; 40 } 41 42 getline(cin,publisher); 43 Publisher[publisher].insert(id); 44 45 getline(cin,year); 46 Year[year].insert(id); 47 } 48 int M,num; 49 string ss; 50 scanf("%d",&M); 51 for(int i=0;i<M;i++){ 52 scanf("%d: ",&num); 53 getline(cin,ss); 54 if(num==1) output(Title,ss,1); 55 else if(num==2) output(Author,ss,2); 56 else if(num==3) output(Key,ss,3); 57 else if(num==4) output(Publisher,ss,4); 58 else output(Year,ss,5); 59 } 60 return 0; 61 }
原文:https://www.cnblogs.com/wsshub/p/12540682.html