#include "TextQuery.h" TextQuery::TextQuery(ifstream& infile):file(new vector) { string text; while(getline(infile, text)) //对文件中的每一行 { file->push_back(text); //保存一行文本 int n = file->size()-1; //记录行号 istringstream line(text); //分配一个字符串流 string word; while(line >> word) //提取一行字符串中的没一个单词 { auto &lines = wm[word]; //lines 的类型为mapped_type是一个shared_ptr,指向set if(!lines) //如果word在wm中不存在,则lines是一个空指针 { lines.reset(new set); //如果不存在,为lines分配一个set空间,并用reset使lines指向新分配的set } lines->insert(n); //将行号插入到对应word的set中 } } } QueryResult TextQuery::query(const string& word) const { static shared_ptr> nodata(new set); //如果未找到word,就返回这个指针 auto loc = wm.find(word); if(loc == wm.end()) { return QueryResult(word, file, nodata); //未找到 } else { return QueryResult(word, file, loc->second); } } QueryResult::QueryResult(const QueryResult& s) { sought = s.sought; file = make_shared>(); copy(s.file->begin(), s.file->end(), file->begin()); lines = make_shared>(); copy(s.lines->begin(), s.lines->end(), lines->begin()); } ostream& print(ostream &os, const QueryResult& qr) { os << qr.sought << " occurs " << qr.lines->size() << "times:" << endl; for(auto it : *qr.lines) { cout << "\t (line " << it+1 << ") "; cout << *(qr.file->begin() + it) <> s) || s == "q") break; else print(cout, tq.query(s)) << endl; } } int main() { ifstream infile("TextQuery.txt"); runQueries(infile); return 0; }