设为首页 加入收藏

TOP

c/c++ 继承与多态 文本查询的小例子(非智能指针版本)(二)
2019-01-11 00:14:20 】 浏览:242
Tags:c/c 继承 文本 查询 例子 智能 指针 版本
std::string query_word; }; class NotQuery : public Query_base{ friend Query operator~(const Query&); NotQuery(const Query& q) :query(q){//调用Query的拷贝构造函数 std::cout << "NotQuery" << std::endl; } std::string rep() const { return "~(" + query.rep() + ")"; } virtual NotQuery* clone() const { return new NotQuery(*this); } QueryResult eva l(const TextQuery&)const; Query query; }; inline Query operator~(const Query& op){ //return std::shared_ptr<Query_base>(new NotQuery(op)); Query_base* tmp = new NotQuery(op); return Query(tmp); } class BinaryQuery : public Query_base{ protected: BinaryQuery(const Query& l, const Query& r, std::string s) : lhs(l), rhs(r), opSym(s){ std::cout << "BinaryQuery" << std::endl; } std::string rep() const { return "(" + lhs.rep() + " " + opSym + " " + rhs.rep() + ")"; } Query lhs, rhs; std::string opSym; }; class AndQuery : public BinaryQuery{ friend Query operator&(const Query&, const Query&); AndQuery(const Query& l, const Query& r) : BinaryQuery(l, r, "&"){ std::cout << "AndQuery" << std::endl; } QueryResult eva l(const TextQuery&) const; virtual AndQuery* clone() const { return new AndQuery(*this); } }; inline Query operator&(const Query& lhs, const Query& rhs){ return new AndQuery(lhs, rhs); } class OrQuery : public BinaryQuery{ friend Query operator|(const Query&, const Query&); OrQuery(const Query& l, const Query& r) : BinaryQuery(l, r, "|"){ std::cout << "OrQuery" << std::endl; } virtual OrQuery* clone() const { return new OrQuery(*this); } QueryResult eva l(const TextQuery&) const; }; inline Query operator|(const Query& lhs, const Query& rhs){ return new OrQuery(lhs, rhs); } #endif

Query.cpp

#include "Query.h"
#include <algorithm>
#include <memory>

/*
std::ostream& operator<<(std::ostream& os, const Query& q){
  //Query::rep通过它的Query_base指针对rep()进行虚调用
  return os << q.rep();
}
*/
Query::Query(const std::string& s) : q(new WordQuery(s)){
    std::cout << "Query pub" << std::endl;
}

QueryResult NotQuery::eva l(const TextQuery& text)const{
  //通过Query运算对象对eva l进行虚调用
  auto result = query.eva l(text);
  //开始时结果set为空
  auto ret_lines = std::make_shared<std::set<line_no>>();
  auto beg = result.begin();
  auto end = result.end();
  //对于输入文件的每一行,如果该行不在result当中,则将其添加到ret_lines
  auto sz = result.get_file()->size();
  for(size_t n = 0; n != sz; ++n){
    //如果还没有处理完result的所以行
    //检查当前行是否存在
    if(beg == end || *beg != n){
      ret_lines->insert(n);
    }
    else if(beg != end){
      ++beg;//继续获取reslut的下一行
    }
  }

  return QueryResult(rep(), ret_lines, result.get_file());
}

QueryResult AndQuery::eva l(const TextQuery& text)const{
  //通过Query成员lhs,rhs进行虚调用
  //调用eva l返回每个对象的QueryResult
  auto right = rhs.eva l(text);
  auto left  = lhs.eva l(text);
  //保存left和right交集的set
  auto ret_lines =
    std::make_shared<std::set<line_no>>();
  //将两个范围的交集写入一个目的迭代其中。
  std::set_intersection(left.begin(), left.end(),
            right.begin(), right.end(),
            inserter(*ret_lines, ret_li
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c/c++ 继承与多态 文本查询的小例.. 下一篇cf1102F. Elongated Matrix(状压d..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目