PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
分析:
一本書信息由6個,想到用結構體來存。 至于每一個信息可以用string來存,而關鍵字在想使用vector<string> keywords還是set<string> keywords來存呢? 看到下面需要查找,自然放棄vector,選用set來存關鍵字。
另一個問題是 讀入的時候是書名或者作者等中間都有空格, 所以讀入的時候需要使用getline(cin,第二個參數). 注意:如果getline之前使用了cin,需要先用一個getchar()讀掉一個回車。
另外,對于關鍵字,這一行最多有5個關鍵字,這里使用C++的一個關于字符串的類stringstream,主要用來做字符切割,比如關鍵字這種情況。讀入一行,切割成幾個關鍵字。
下面是一個stringstream的用法舉例。
對于查詢操作, 從第3個下標開始才是有用信息,到底是書名還是作者等等。之前的 line[0]代表查詢的種類
string info =line.substr(3); //有用信息查詢到的結果用vector來存,因為要求id從小到大排序,所以只需要對vector排序輸出即可。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N =1e4+10;//書的結構體 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里面讀東西出來string keyword;set<string> keywords;//分離getline讀入的一行中的keywordwhile(ssin>>keyword){keywords.insert(keyword);}string publisher,year;getline(cin,publisher);cin>>year;//信息壓入結構體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甲級1022 Digital Library (30分)
總結
以上是生活随笔為你收集整理的PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1012 The Best R
- 下一篇: PAT甲级1025 PAT Rankin