根据书里的提示写的
提示:
1.使用vector保存文本;
2.用map保存<string,set<int> >的关键字,和关键字所属行号。
3.使用ifstream,istringstream,ostream来解析文本,输出结果
是完全自己写的实现,和书里的结构不太一样,但处理查询的思路是相同,毕竟提示已经给到这个地步了。
头文件
#include<string> #include<set> #include<map> #include<iostream> #include<vector> #include<fstream> #include<sstream> using std::istringstream; using std::cout; using std::cin; using std::endl; using std::map; using std::set; using std::string; using std::ifstream; using std::vector; class QueryResult { public: vector<string> *pdata; string curr; set<int> *pset; QueryResult(const string &c,vector<string> *pd):curr(c),pdata(pd),pset(NULL) { } }; class TextQuery { public: TextQuery(ifstream &file); QueryResult Query(string curr); private: vector<string> data; map<string,set<int> > wordsDic; }; void Print(std::ostream &os,QueryResult ); 实现文件
测试文件#include"TextQueryAndQueryResult.h" TextQuery::TextQuery(ifstream &pfile) { pfile.open("D:\\测试\\文本查询程序\\测试文本查询程序.txt"); string aLineTxt; int lineIndex = 0; while (std::getline(pfile,aLineTxt)) { istringstream pLine(aLineTxt); data.push_back(aLineTxt); string aWord; while (pLine>>aWord) { auto iter = wordsDic.find(aWord); if(iter == wordsDic.end()) { set<int> tempSet; tempSet.insert(lineIndex); wordsDic.insert(std::pair<string,set<int> >(aWord,tempSet)); } else { if(iter->second.find(lineIndex)==iter->second.end()) { iter->second.insert(lineIndex); } } } ++lineIndex; } } QueryResult TextQuery::Query(string curr) { QueryResult r(curr,&data); auto iter = wordsDic.find(curr); if(iter != wordsDic.end()) { r.pset = &(iter->second); } return r; } void Print(std::ostream &os,QueryResult r) { if(r.pset!=NULL) { os<< r.curr<<" occurs "<<r.pset->size()<<"times"<<endl; for(auto iter = r.pset->begin(); iter!= r.pset->end(); ++iter) { os<<"(line "<<*iter<<") "<< (*r.pdata)[*iter]<<endl; } } else { os<<"can not find "<<r.curr<<endl; } }
#include"TextQueryAndQueryResult.h" #include<iostream> void RunQueries(std::ifstream &infile) { TextQuery t(infile); while(true) { cout<<"enter word to look for,or q to quit:" ; string s; if(!(cin>>s) || s=="q")break; Print(cout,t.Query("told")); } } int main() { ifstream temp; RunQueries(temp); system("pause"); return 0; }