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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ primer文本查询程序 自编加强版(c++primer5th 练习12.32-33)

發布時間:2024/4/18 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ primer文本查询程序 自编加强版(c++primer5th 练习12.32-33) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//文件 functions.cc#include <iostream> #include <string> #include <vector> #include <memory> #include <fstream> #include <map> #include <set> #include <sstream> #include "textquery.h" #include "resultquery.h" #include "strblob.h" using namespace std; TextQuery::TextQuery()= default; TextQuery::TextQuery(ifstream &is){string text;while(getline(is,text)){file.push_back(text);int n = file.size() - 1;istringstream line(text);string word;while(line >> word){auto &lines = wm[word];if(!lines)//我們在第一次遇到這個單詞時,這個指針是空的lines.reset(new set<line_no>);//分配一個新的空間lines->insert(n);} } } QueryResult TextQuery::query(const string &sought)const {shared_ptr<set<TextQuery::line_no>> nodata(new set<TextQuery::line_no>);auto loc = wm.find(sought);if(loc == wm.end())return QueryResult(sought,nodata,file);//not foundelsereturn QueryResult(sought,loc->second,file); }ostream &print(ostream &os,const QueryResult &qr) { os << qr.sought << " occurs " << qr.lines->size() << " "<<make_plural(qr.lines->size(),"times","s") << endl; for(auto num : *qr.lines)os << "\t(line " << num + 1 << ") " << (*qr.file.Data())[num] << endl; return os; }const string make_plural(size_t i,const string &s,const string&ch) { if(i > 1)return s + ch; else return s; }StrBlob::StrBlob(initializer_list<string> l1):data(make_shared<vector<string>>(l1)){} string &StrBlob::front(){return data->front();} string &StrBlob::back(){return data->back(); } const string &StrBlob::front()const {return data->front();} const string &StrBlob::back()const{return data->back();} size_t StrBlob::size()const{return data->size();} bool StrBlob::empty()const{return data->empty();} void StrBlob::push_back(const string &s) {data->push_back(s); } string StrBlob::pop(){ string s = data->back(); data->pop_back(); return s; } //main.cc#include <string> #include <iostream> #include <fstream> #include <memory> #include <vector> #include "textquery.h" #include "resultquery.h" #include "strblob.h" using namespace std; int main() { ifstream in("data.txt"); TextQuery t(in); QueryResult q = t.query("bye"); print(cout,q); print(cout,t.query("are")); for (auto i = t.query("are").begin();i != t.query("are").end();++i)cout << *i << endl; StrBlob s = q.get_file(); //嘗試下打印文件內容 for(auto i = s.Data()->begin();i != s.Data()->end();++ i)cout << *i << endl;return 0; } //文件resultquery.h#ifndef RESULTQUERY_H #define RESULTQUERY_H#include <string> #include <vector> #include <iostream> #include <memory> #include <set> #include <map> #include "strblob.h" using namespace std; class QueryResult{friend ostream & print(ostream &,const QueryResult &);public: QueryResult():lines(new set<TextQuery::line_no>){} QueryResult(const string &s,shared_ptr<set<TextQuery::line_no>> p,const StrBlob & f):sought(s),lines(p),file(f){} set<TextQuery::line_no>::iterator begin()const{return lines->begin();} set<TextQuery::line_no>::iteratorend()const{return lines->end();} const StrBlob & get_file()const{return file;} StrBlob &get_file(){return file;}private: string sought; //查詢單詞 //注意使用的line_no是TextQuery類內定義的類型 shared_ptr<set<TextQuery::line_no>> lines; //出現的行號 StrBlob file; //輸入文件 }; const string make_plural(size_t i,const string &s,const string &ch);ostream &print(ostream &,const QueryResult &); #endif //strblob.h#ifndef STRBLOB_H #define STRBLOB_H#include <iostream> #include <string> #include <memory> #include <vector>using namespace std; class ResultQuery; class StrBlob{public:StrBlob():data(make_shared<vector<string>>()){}StrBlob(initializer_list<string> l1);string& front();string& back();const string &front()const;const string &back()const;size_t size()const;bool empty()const;void push_back(const string &);string pop();shared_ptr<vector<string>> Data()const{return data;}private:void check(size_t i,const string &msg);shared_ptr<vector<string>> data; };#endif //文件textquery.h#ifndef TEXTQUERY_H #define TEXTQUERY_H #include <string> #include <fstream> #include <iostream> #include <set> #include <map> #include <vector> #include "strblob.h" using namespace std;class QueryResult; class TextQuery{public: using line_no = std::vector<string>::size_type; TextQuery(); TextQuery(ifstream & ); QueryResult query(const string &)const;private:StrBlob file; map<string,shared_ptr<set<line_no>>> wm; };#endif

文件data.txt內容如下:?

you are good enough are you you are happy haha you good good good enough

?

運行結果

bye occurs 0 times are occurs 2 timess(line 1) you are good enough are you(line 2) you are happy 0 1 you are good enough are you you are happy haha you good good good enough

?

總結

以上是生活随笔為你收集整理的c++ primer文本查询程序 自编加强版(c++primer5th 练习12.32-33)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。