PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询
文章目錄
- 題目分析
- 題目鏈接
題目分析
分析:
一本書信息由6個(gè),想到用結(jié)構(gòu)體來(lái)存。 至于每一個(gè)信息可以用string來(lái)存,而關(guān)鍵字在想使用vector<string> keywords還是set<string> keywords來(lái)存呢? 看到下面需要查找,自然放棄vector,選用set來(lái)存關(guān)鍵字。
另一個(gè)問(wèn)題是 讀入的時(shí)候是書名或者作者等中間都有空格, 所以讀入的時(shí)候需要使用getline(cin,第二個(gè)參數(shù)). 注意:如果getline之前使用了cin,需要先用一個(gè)getchar()讀掉一個(gè)回車。
另外,對(duì)于關(guān)鍵字,這一行最多有5個(gè)關(guān)鍵字,這里使用C++的一個(gè)關(guān)于字符串的類stringstream,主要用來(lái)做字符切割,比如關(guān)鍵字這種情況。讀入一行,切割成幾個(gè)關(guān)鍵字。
下面是一個(gè)stringstream的用法舉例。
對(duì)于查詢操作, 從第3個(gè)下標(biāo)開(kāi)始才是有用信息,到底是書名還是作者等等。之前的 line[0]代表查詢的種類
string info =line.substr(3); //有用信息查詢到的結(jié)果用vector來(lái)存,因?yàn)橐骾d從小到大排序,所以只需要對(duì)vector排序輸出即可。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N =1e4+10;//書的結(jié)構(gòu)體 struct Book{string id,name,author;set<string> keywords;string publisher;string year;};int main(){int n,m;cin>>n;vector<Book> books;for(int i =0; i<n;i++){ //每一本書string id , name ,author;cin>>id;getchar();//讀回車getline(cin,name),getline(cin,author);//用于處理keyword,存放在set中string line;getline(cin,line);stringstream ssin(line); //從string里面讀東西出來(lái)string keyword;set<string> keywords;//分離getline讀入的一行中的keywordwhile(ssin>>keyword){keywords.insert(keyword);}string publisher,year;getline(cin,publisher);cin>>year;//信息壓入結(jié)構(gòu)體books.push_back({id, name ,author, keywords,publisher,year});}cin>>m;getchar();//讀入上一行的回車string line;for(int i = 0 ;i<m; i++){getline(cin,line); //讀一行cout<<line<<endl;vector<string> res; //存id,用于輸出string info =line.substr(3); //查詢的有效信息,比如書名,作者char t= line[0];//查詢類型if(t=='1'){for(auto & book : books){ //遍歷所有的書if(book.name == info)res.push_back(book.id);}}else if(t=='2'){for(auto & book : books){if(book.author == info)res.push_back(book.id);}}else if(t=='3'){for(auto & book : books){if(book.keywords.count(info))res.push_back(book.id);}}else if(t=='4'){for(auto & book : books){if(book.publisher == info)res.push_back(book.id);}}else {for(auto & book : books){if(book.year == info)res.push_back(book.id);}}if(res.empty()) cout<<"Not Found"<<endl;else{sort(res.begin(),res.end()); //按序輸出for(auto c:res) cout<<c<<endl;}}}題目鏈接
PAT甲級(jí)1022 Digital Library (30分)
總結(jié)
以上是生活随笔為你收集整理的PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PAT甲级1012 The Best R
- 下一篇: PAT甲级1025 PAT Rankin