64,649
社区成员
发帖
与我相关
我的任务
分享
//TextQuery.h
#ifndef TEXTQUERY_H_INCLUDED
#define TEXTQUERY_H_INCLUDED
#include <vector>
#include <map>
#include <set>
#include <string>
#include <fstream>
#include <memory>
class QueryResult;
class TextQuery
{
public:
using line_no=std::vector<std::string>::size_type;
TextQuery(std::fstream&);
QueryResult query(const std::string&) const;
private:
std::shared_ptr<std::vector<std::string>> file;
std::map<std::string,std::shared_ptr<std::set<line_no>>> wm;
};
class QueryResult
{
friend std::ostream &print(std::ostream&,const QueryResult&);
public:
QueryResult(std::string s,std::shared_ptr<std::set<TextQuery::line_no>> p,std::shared_ptr<std::vector<std::string>> f):sought(s),lines(p),file(f){}
private:
std::string sought;
std::shared_ptr<std::set<TextQuery::line_no>> lines;
std::shared_ptr<std::vector<std::string>> file;
};
#endif // TEXTQUERY_H_INCLUDED
//TextQuery.cpp
#include "TextQuery.h"
#include <sstream>
#include <algorithm>
#include <ostream>
using std::string;
using std::vector;
using std::set;
using std::istream;
using std::istringstream;
using std::shared_ptr;
using std::fstream;
using std::ostream;
using std::endl;
TextQuery::TextQuery(fstream &is):file(new vector<string>)
{
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);
}
}
}
string make_plural(size_t ctr,const string &word,const string &ending)
{
return (ctr>1)?word+ending:word;
}
QueryResult TextQuery::query(const string &sought) const
{
static shared_ptr<set<line_no>> nodata(new set<line_no>);
auto loc=wm.find(sought);
if(loc==wm.end())
return QueryResult(sought,nodata,file);
else
return QueryResult(sought,loc->second,file);
}
ostream &print(ostream &os,const QueryResult &qr)
{
os<<qr.sought<<"occurs"<<qr.lines->size()<<" "<<make_plural(qr.lines->size(),"time","s")<<endl;
for(auto num:*qr.lines)
os<<"\t(line"<<num+1<<")"<<*(qr.file->begin()+num)<<endl;
return os;
}
//main()
#include "TextQuery.h"
#include <iostream>
using std::fstream;
using std::string;
using std::cout;using std::endl;using std::cin;
void runQueries(fstream &infile)
{
TextQuery tq(infile);
while(true)
{
cout<<"enter word to look for,or q to quit:";
string s;
if(!(cin>>s)||s=="q")
break;
print(cout,tq.query(s))<<endl;
}
}
int main()
{
fstream file("~/. 1111");
runQueries(file);
return 0;
}