设为首页 加入收藏

TOP

c/c++ 继承与多态 文本查询的小例子(智能指针版本)(二)
2019-01-11 00:14:21 】 浏览:230
Tags:c/c 继承 文本 查询 例子 智能 指针 版本
<Query_base>(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; } QueryResult eva l(const TextQuery&) const; }; inline Query operator|(const Query& lhs, const Query& rhs){ return std::shared_ptr<Query_base>(new OrQuery(lhs, rhs)); } #endif

Query.cpp

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

/*
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_lines->begin()));
  return QueryResult(rep(), ret_lines, left.get_file());
}

QueryResult OrQuery::eva l(const TextQuery& text)const{
  //通过Query成员lhs,rhs进行虚调用
  //调用eva l返回每个对象的QueryResult
  auto right = rhs.eva l(text);
  auto left  = lhs.eva l(text);
  //将左侧运算对象的行号拷贝到结果set中
  auto ret_lines =
    std::make_shared<std::set<line_no>>(left.begin(), left.end());
  //插入右侧运算对象所得的行号
  ret_lines->insert(right.begin(), right.end());
  //返回一个新的QueryResult,它表示lhs和rhs的并集
  return QueryResult(rep(), ret_lines, right.get_file());
}

QueryResult.h

#ifndef __QUERYRESULT_H__
#define __QUERYRESULT_H__

#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <memory>

class QueryResult{
  friend std::ostream& print(std::ostream&, const QueryResult&);
public:
  using line_no = std::vector<std::string>::size_type;
  using Iter = std::set<line_no>::iterator;
  QueryResult(std::string s, std::shared_ptr<std::set<line_no>> p,
              std::shared_ptr<std::vector<std::string>> f):
    sought(s), lines(p), file(f){}
    Iter begin() const {return lines->begin();}
    Iter end() const {return lines->end();}
    std::shared_ptr<std::vector<std::string>> get_file() const{
      return file;
    }
private:
  std::string sought;//查询的单词                                                    
  std::shared_ptr<std::set<line_no>> lines;//出现的行号                                   
  std::shared_ptr<std::vector<s
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MFC开发(一)简单同步时间应用程.. 下一篇c/c++ 继承与多态 文本查询的小例..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目