日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询

發(fā)布時(shí)間:2025/4/5 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1022 Digital Library (30分):[C++题解]结构体、排序、查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 題目分析
    • 題目鏈接

題目分析

分析:
一本書信息由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的用法舉例。

getline(cin, line);//讀入關(guān)鍵字一行 stringstream ssin(line); //對(duì)象ssin初始化為line,里面存的是line中的內(nèi)容 string tmp; //用來(lái)讀出一個(gè)一個(gè)關(guān)鍵字 set<string> keywords; while(ssin>>tmp){keywords.insert(tmp); //set中插入 讀入的幾個(gè)關(guān)鍵字 }

對(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。