这道题为模拟题,相对简单,只是处理起来较为麻烦。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#include<sstream>
using namespace std;
const int N=10010,M=1010;
int n;
struct book{
string id,title,author;
set<string>key;
string publisher,years;
};
int main()
{
cin>>n;
getchar();
vector<book> books;
for(int i=0;i<n;i++){
string id,title, author;
cin >> id;
getchar();
getline(cin, title);
getline(cin, author);
string line;
getline(cin,line);
stringstream ssin(line);
string keyword;
set<string> keywords;
while (ssin >> keyword) keywords.insert(keyword);
string publisher, year;
getline(cin, publisher);
cin >> year;
books.push_back({id, title, author, keywords, publisher, year});
}
int m;
cin>>m;
getchar();
while(m--){
string query;
getline(cin,query);
cout<<query<<endl;
int id=query[0]-'0';
string s=query.substr(3);
vector<string> ids;
if(id==1){
for(auto& book:books)
if(book.title==s)
ids.push_back(book.id);
}
else if(id==2){
for(auto& book:books)
if(book.author==s)
ids.push_back(book.id);
}
else if(id==3){
for(auto& book:books)
if(book.key.count(s))
ids.push_back(book.id);
}
else if(id==4){
for(auto& book:books)
if(book.publisher==s)
ids.push_back(book.id);
}
else if(id==5){
for(auto& book:books)
if(book.years==s)
ids.push_back(book.id);
}
if(ids.size()==0) cout<<"Not Found"<<endl;
else {
sort(ids.begin(),ids.end());
for(auto id:ids)
cout<<id<<endl;
}
}
return 0;
}
处理方法:
1.分隔符为单个字符时
stringstream
类是<sstream>
头文件中定义的流之一, 它的操作类似于cin、cout
,常用于数据类型的转换(字符串转为数值型),除此之外还能用来对字符串进行分割操作。
stringstream
类中常用的函数有:
str()
:返回stringstream
对象中的字符串。str(string s)
:先清空,然后将字符串s
赋值给stringstream
对象。clear()
:清空stringstream
对象中的内容。operator<<()
:向stringstream
对象中插入数据,默认是直接在末尾插入数据,但是如果前面调用了2函数再使用此操作则会直接从头开始插入。operator>>()
:从stringstream
对象中提取数据,操作类似于cin、cout
。
例子:
将字符串"Hello World! My name is C++"按空格分割。
由于中间是由空白符做分割,而c++输入流是默认跳过空白符的所以可以直接只用>>
操作将其进行分割。
Code
string s = "Hello World! My name is C++", t;
stringstream ss;
ss << s; //将s字符串写入到流中,写成ss.str(s)或者ss(s)也可以
vector<string> res;
while (ss >> t)
res.push_back(t);
for (auto s : res)
cout << s << endl;
2.读取整行的字符串(含有空格)
getline(cin,line);
注意如果前面的cin>>n,需要用getchar()读取后面的换行符然后在使用getline();