注意query函数中的参量需要使用引用 否则最后一个测试点会超时
引用参数和传值参数的区别:
-
我们都知道,普通的传值参数是由行参传给实参;
编译器在函数内部为每一个参数产生一个临时变量,将每一个参数压入栈(stack)中,将实参的数值保存到临时变量中。所以才有在低端8位机中,对参数的数量有比较严格的限制,因为栈的深度非常有限;当然,在通用机上也有同样的问题,参数过多不合适,但通用机的栈的深度比低端机大多了; -
引用做参数传递的是变量的地址;实质上传递的是变量的指针;引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作;
而常引用做参数就是保护参数不被修改;
#include<cstdio>
#include<iostream>
#include<map>
#include<set>
#include<string>
using namespace std;
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{
for(set<int>::iterator it = mp[str].begin();it!=mp[str].end();it++){
printf("%07d\n",*it);//输出str对应的所有id 注意前面要补0
}
}
}
int main(){
int n,m,id,type;
string title,author,key,pub,year;
scanf("%d",&n); //n本书
for(int i=0;i<n;i++){
scanf("%d",&id);
char c = getchar();//除去换行
getline(cin,title);
mpTitle[title].insert(id);
getline(cin,author);
mpAuthor[author].insert(id);
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 temp;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d: ",&type);
getline(cin,temp);
cout<<type<<": "<<temp<<endl;
if(type == 1) query(mpTitle,temp);
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);
}
return 0;
}