st string &s) : query_word(s) {
}
set
WordQuery::eva l(const TextQuery &t) const {
return t.run_query(query_word);
}
ostream & WordQuery::display(ostream &os) const {
return os << query_word;
}
/**
* NotQuery
*/
NotQuery::NotQuery(Query q) : query(q) {
}
set
NotQuery::eva l(const TextQuery &file) const { set
has_val = query.eva l(file); set
ret_lines; for (TextQuery::line_no n = 0; n != file.size(); ++n) { if (has_val.find(n) == has_val.end()) { ret_lines.insert(n); } } return ret_lines; } ostream & NotQuery::display(ostream &os) const { return os << "~(" << query << ")"; } /** * BinaryQuery */ BinaryQuery::BinaryQuery(Query left, Query right, string op) : lhs(left), rhs(right), oper(op) { } ostream & BinaryQuery::display(ostream &os) const { return os << "(" << lhs << " " << oper << " " << rhs << ")"; } /** * AndQuery */ AndQuery::AndQuery(Query left, Query right) : BinaryQuery(left, right, "&") { } set
AndQuery::eva l(const TextQuery&file) const { set
left = lhs.eva l(file), right = rhs.eva l(file); set
ret_lines; set_intersection(left.begin(), left.end(), right.begin(), right.end(), inserter(ret_lines, ret_lines.begin())); return ret_lines; } /** * OrQuery */ OrQuery::OrQuery(Query left, Query right) : BinaryQuery(left, right, "|") { } set
OrQuery::eva l(const TextQuery&file) const { set
right = rhs.eva l(file), ret_lines = lhs.eva l(file); ret_lines.insert(right.begin(), right.end()); return ret_lines; }
下面是以上代码的用法示例:
main.cpp
#include "Query.h"
#include "Query_base.h"
using namespace std;
inline Query operator~(const Query &oper) {
return new NotQuery(oper);
}
inline Query operator|(const Query &left, const Query &right) {
return new OrQuery(left, right);
}
inline Query operator&(const Query &left, const Query &right) {
return new AndQuery(left, right);
}
int main(int argc, const char * argv[])
{
string article[] = {
"Alice Emma has long flowing red hair.",
"Her Daddy says when the wind blows",
"through her hair, it looks almost alive,",
"like a fiery bird in flight",
"A beautiful fiery bird, he tells her,",
"magical but untamed.",
"\"Daddy, shush, there is no such thing,\"",
"she tells him, at the same time wanting",
"him to tell her more.",
"Shyly, she asks, \"I mean, Daddy, is there?\""
};
Query q = ~(Query("fiery") & Query("bird") | Query("wind"));
set
::size_type> result = q.eva l(TextQuery(article, sizeof(article)/sizeof(article[0])));
for (set
::size_type>::iterator iter = result.begin(); iter != result.end(); iter++) { cout << *iter+1 << endl; } return 0; }
以上代码中需要注意的语法点有:
1. Query的几个重载操作符如果作为inline函数的话,必须放在定义的头文件或者用到重载操作符的实现文件中,在本例中如果放在Query.h文件中,由于需要引入Query_base.h文件,会导致头文件循环引用的问题,因此放在了main函数中。<<操作符由于没有使用其他类,所以可以放在Query_base.h文件中。
2. 由于NotQuery、OrQuery、AndQuery几个类的构造函数都是私有的,因此必须将使用到这几个类的函数声明为友元函数,在本例中为&、|、~几个操作符函数。
如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)个人博客:http://blog.csdn.net/zhaoxy2850本文地址:http://blog.csdn.net/zhaoxy_thu/article/details/37995161转载请注明出处,谢谢!