12章后边的文本查询类的定义中定义了一个文本查询程序,这次加入了可以进行或运算、与运算的查询程序。
对于12章的程序来说我修改了QueryResult这个类,添加了两个重载的运算符,分别表示或运算、与运算,这与书上讲的方法并不一样,就我个人看来应该是最直接、简单、容易维护的方法,只是书上用到了面向对象的知识,我只用到了重载。
QueryResult中添加
QueryResult& operator&(QueryResult& const qr) { set<line_no> new_set; for (auto num : *(lines)) { if (qr.lines->find(num) != (qr.lines)->end()) { new_set.insert(num); } } lines->erase(lines->begin(), lines->end()); lines->insert(new_set.begin(), new_set.end()); sought += "&" + qr.sought; return *this; } QueryResult& operator|(QueryResult& const qr) { lines->insert(qr.lines->begin(), qr.lines->end()); sought += "|" + qr.sought; return *this; }
TextQuery中修改
QueryResult query()const { static shared_ptr<set<line_no>> nodata(new set<line_no>); return (QueryResult("is", wm.find("is")->second, file) | QueryResult("are", wm.find("are")->second, file) | QueryResult("was", wm.find("was")->second, file) | QueryResult("were", wm.find("were")->second, file)) & (QueryResult("It", wm.find("It")->second, file) | QueryResult("it", wm.find("it")->second, file)); }
runQueries函数修改(用户不能输入了)
void runQueries(ifstream &infile) { TextQuery tq(infile); while (true) { cout << "enter the word to look for, or q to quit:"; string s; if (!(cin >> s) || s == "q") break; print(cout, tq.query()) << endl; } }