c++ primer文本查询程序 自编加强版(c++primer5th 练习12.32-33)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error: passing ‘cons
- 下一篇: error: conversion fr