方法一:
1.用的是vector存储,第一行存id,第二行存book title ....依次存储
2.查询时对于序号那一行遍历比较。特别的,Key值是用的string里的 find 函数查找是否为子串用遍历搜寻有没有相同的值
3.相同则放进优先队列排序,优先队列要重新定义运算符
注意:cin输值以后,用getline前,要先用cin.get()
比较麻烦
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e4+4;
vector<string> v[maxn];
int main(){
int n;
cin>>n;
cin.get();
string s;
for(int i=0;i<n;i++){
for(int j=0;j<6;j++){
getline(cin,s);
v[j].push_back(s);
}
}
int m;
cin>>m;
int xu;
char c;
priority_queue<string,vector<string> ,greater<string> > q;
for(int i=1;i<=m;i++){
cin>>xu>>c;
cin.get();
getline(cin,s);
cout<<xu<<c<<" "<<s<<endl;
int f=0;
for(int j=0;j<v[xu].size();j++){
if(xu==3){
int index=v[xu][j].find(s);
if(index>=0&&index<v[xu][j].size())
q.push(v[0][j]);
}
else if(s==v[xu][j]){
q.push(v[0][j]);
}
}
if(q.empty()) cout<<"Not Found\n";
else{
while(!q.empty()){
cout<<q.top()<<endl;
q.pop();
}
}
}
return 0;
}
方法二:
用map数组存储,value为vector,
mp[s1][s2].push_back(id)
先按照title,autor,等等进行划分title相等的,将他们的id都记下来
对于key值,在输入是用istringstream进行划分后,再保存
排序用sort就可以
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<sstream>
using namespace std;
const int maxn=1e4+5;
map<string,vector<string> > mp[7];
int main(){
int n;
cin>>n;
cin.get();
string s,id,t;
for(int i=1;i<=n;i++){
getline(cin,id);
for(int j=1;j<=5;j++){
getline(cin,s);
if(j==3){
istringstream is(s);//将s读入is中
while(is>>t){//再按空格分割,依次读入t中
mp[j][t].push_back(id);
}
}
else
mp[j][s].push_back(id);
}
}
int m;
cin>>m;
int xu;
char c;
while(m--){
cin>>xu>>c;
cin.get();
getline(cin,s);
cout<<xu<<c<<" "<<s<<endl;
if(mp[xu][s].size()==0) cout<<"Not Found\n";
else{
sort(mp[xu][s].begin(),mp[xu][s].end());
for(int i=0;i<mp[xu][s].size();i++)
cout<<mp[xu][s][i]<<endl;
}
}
return 0;
}