C++ 文本查询2.0(逻辑查询)
代码实例实现了继承和友元之间的关系,以及为了隐藏实际继承实现,而实现的接口类,代码偏乱,楼主- -自看的(提醒作用)
TextQuery.h
//
// Created by 徐爱东 on 17/7/19.
// #ifndef TEXTQUERY_2_0_TEXTQUERY_H
#define TEXTQUERY_2_0_TEXTQUERY_H #include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <memory>
#include <sstream>
#include <fstream> class QueryResult
{
friend std::ostream &operator<<(std::ostream &os, const QueryResult &result); typedef std::vector<std::string>::size_type line_no;
public:
QueryResult(const std::string &word, std::shared_ptr<std::set<line_no> > lines,
std::shared_ptr<std::vector<std::string>> files); std::set<line_no>::iterator begin()
{
return lines_->begin();
} std::set<line_no>::iterator end()
{
return lines_->end();
} std::shared_ptr<std::vector<std::string> > get_file()
{
return files_;
} private:
std::string word_; //查询单词
std::shared_ptr<std::set<line_no>> lines_; //单词出现行数集合
std::shared_ptr<std::vector<std::string>> files_; //根据的文件 }; class TextQuery
{
public:
// using line_no=std::vector<std::string>::size_type ;
typedef std::vector<std::string>::size_type line_no; //C++11 TextQuery(std::fstream &in); QueryResult query(const std::string &word) const; private:
std::shared_ptr<std::vector<std::string> > filecontext_; //文件内容
std::map<std::string, std::shared_ptr<std::set<line_no> > > wordlinesset_; //单词集合
}; #endif //TEXTQUERY_2_0_TEXTQUERY_H
TextQuery.cpp
//
// Created by 徐爱东 on 17/7/19.
// #include "TextQuery.h" QueryResult::QueryResult(const std::string &word, std::shared_ptr<std::set<line_no> > lines,
std::shared_ptr<std::vector<std::string>> files)
: word_(word), lines_(lines), files_(files)
{ } std::ostream &operator<<(std::ostream &os, const QueryResult &result)
{
if (!result.lines_)
{
return os << result.word_ << " apprear 0 time:\n"; } else
{
os <<"\n"<< result.word_ << " appear " << result.lines_->size()
<< (result.lines_->size() > ? " times:" : " time:") << "\n\n"; for (auto iter = result.lines_->cbegin();
iter != result.lines_->cend(); iter = (result.lines_->upper_bound(*iter)))
{
os << "\t\t\t\t\t(line" << *iter + << "): " << *(result.files_->begin() + *iter) << std::endl<<std::endl;
} return os;
}
} TextQuery::TextQuery(std::fstream &in)
: filecontext_(new std::vector<std::string>{})
{
std::string line;
std::stringstream stream; //每次获得一行
while (std::getline(in, line))
{
stream.clear();
filecontext_->push_back(line);
auto linenumber = filecontext_->size() - ; stream << line;
while (stream >> line)
{
//没有则创建,有则返回只能指针;
auto& lineset = wordlinesset_[line]; if (!lineset)
lineset.reset(new std::set<line_no>); //记录行号
lineset->insert(linenumber);
} } } QueryResult TextQuery::query(const std::string &word) const
{
if (wordlinesset_.find(word) == wordlinesset_.end())
{
std::shared_ptr<std::set<line_no> > null_sharedptr(new std::set<line_no>);
return QueryResult(word, null_sharedptr, filecontext_); } else
{
return QueryResult(word, wordlinesset_.find(word)->second, filecontext_);
} }
Query.h & QueryBase{WordQuery,NotQuery,BinaryQuery{AndQuery,OrQUery}};
基本关系:Query是接口类,QueryBase是抽象类,WordQUery,NotQuery实现类,BinaryQuery抽象类(重构),AndQuery,OrQUery实际类
//
// Created by 徐爱东 on 17/7/19.
// #ifndef TEXTQUERY_2_0_QUERY_BASE_H
#define TEXTQUERY_2_0_QUERY_BASE_H #include "TextQuery.h" class Query; class WordQuery; class NotQuery; class AndQuery; class OrQuery; //抽象类
class Query_base
{
//接口类,用于隐藏继承结构
friend class Query;;
private:
virtual QueryResult eval(const TextQuery &) const =; virtual std::string rep() const =; protected:
using line_no=TextQuery::line_no; virtual ~Query_base() = default; }; class Query
{
friend class Query_base; friend class WordQuery; friend class NotQuery; friend class AndQuery; friend class OrQuery; //运算符操作需要访问私有shared_ptr,所以声明为友元
friend Query operator~(const Query &); friend Query operator&(const Query &lhs, const Query &rhs); friend Query operator|(const Query &l, const Query &r); friend std::ostream &operator<<(std::ostream &os, const Query query)
{
return os << query.rep();
} public:
Query(const std::string &word); //普通单单词查询,WordQuery; //接口函数,因为不是继承Query_base
QueryResult eval(const TextQuery &text) const
{
return q->eval(text);
} std::string rep() const
{
return q->rep();
} private:
//shared_ptr构造,为了使用动态虚调用
//private 不允许外部调用
Query(std::shared_ptr<Query_base> query) : q(query)
{};
std::shared_ptr<Query_base> q;
}; //唯一实际查询的类
class WordQuery : public Query_base
{
//所有成员皆为private
friend class Query; //Query 需要使用构造函数 std::string word_; WordQuery(const std::string &word) : word_(word)
{} QueryResult eval(const TextQuery &Tq) const override
{
return Tq.query(word_);
} std::string rep() const override
{
return word_;
} }; //取反的Query
class NotQuery : public Query_base
{ friend Query operator~(const Query &); NotQuery(const Query &q) : query_(q)
{ } Query query_; //"~单词"返回的结果
QueryResult eval(const TextQuery &Tq) const override
{
auto result = query_.eval(Tq); auto ret_line = std::make_shared<std::set<std::vector<std::string>::size_type>>();
auto set = std::make_shared<std::set<std::vector<std::string>::size_type> >(result.begin(), result.end()); auto file_line = result.get_file()->size(); for (auto line = ; line != file_line; line++)
{
//不在set里
if (set->find(line + ) == set->end())
{
//添加
ret_line->insert(line);
}
} return QueryResult(query_.rep(), ret_line, result.get_file()); } std::string rep() const override
{
return "~(" + query_.rep() + ")";//表示不需要查询的单词
}
}; //BinaryQuery类,一个抽象基类,因为继承了基类的纯虚函数eval()
//重构
class BinaryQuery : public Query_base
{
friend class Query;;
protected:
BinaryQuery(const Query &l, const Query &r, const std::string &operaname)
: lhs_(l),
rhs_(r),
operaname_(operaname)
{ } Query lhs_, rhs_;
std::string operaname_; // QueryResult eval(const TextQuery &) const
// {
//
// } std::string rep() const
{
return "(" + lhs_.rep() + " " + operaname_ + " " + rhs_.rep() + ")";
}
}; class AndQuery : public BinaryQuery
{
friend class Query;;
protected:
friend Query operator&(const Query &, const Query &); AndQuery(const Query &l, const Query &r) : BinaryQuery(l, r, "&")
{} QueryResult eval(const TextQuery &text) const
{
//通过Query成员进行虚调用
//调用eval返回每个QueryResult结果
auto right = lhs_.eval(text), left = rhs_.eval(text);
//空的目标容器
auto ret_lines = std::make_shared<std::set<std::vector<std::string>::size_type>>(); //取交集放入re_lines;
std::set_intersection(right.begin(), right.end(),
left.begin(), left.end(),
std::inserter(*ret_lines, ret_lines->begin())); return QueryResult(rep(), ret_lines, right.get_file());
} }; class OrQuery : public BinaryQuery
{
friend class Query;;
protected:
friend Query operator|(const Query &, const Query &); OrQuery(const Query &l, const Query &r) : BinaryQuery(l, r, "|")
{} QueryResult eval(const TextQuery &text) const
{
//通过Query成员lhs和rhs进行虚调用
//调用eval返回每个运算对象的QueryResult
auto right = lhs_.eval(text), left = rhs_.eval(text);
auto ret_lines = std::make_shared<std::set<std::vector<std::string>::size_type> >(right.begin(), right.end());
//进行并集操作y
ret_lines->insert(left.begin(), left.end());
return QueryResult(rep(), ret_lines, right.get_file());
}
}; //每个Query都先生成基本WordQuery基础
inline Query::Query(const std::string &word) : q(new WordQuery(word))
{ std::cout << "Query" << std::endl; } inline Query operator~(const Query &q)
{
return std::shared_ptr<Query_base>(new NotQuery(q));
} inline Query operator&(const Query &lhs, const Query &rhs)
{
return std::shared_ptr<Query_base>(new AndQuery(lhs, rhs));
} inline Query operator|(const Query &l, const Query &r)
{
return std::shared_ptr<Query_base>(new OrQuery(l, r));
} #endif //TEXTQUERY_2_0_QUERY_BASE_H
main.cpp
#include <iostream>
#include "Query_base.h" int main()
{
std::fstream file_("Text.txt", std::ios::in);
std::vector<std::string> str_vec;
std::vector<Query> que_vec; if (file_.is_open())
{
TextQuery file(file_); std::string word1, word2;
do
{
std::cout << "Input word you want('quit to exit'): ";
std::cin >> word1 >> word2; if (word1 == "quit")
{
break;
} Query query1(word1), query2(word2);
auto q = query1 & query2;
std::cout << q.rep() << std::endl;
std::cout << q.eval(file) << std::endl;
word1.clear();
} while (); } file_.close(); return ;
}
缺点:本来想实现字符串读取分隔实现动态逻辑Query联合,太麻烦- -就没写
C++ 文本查询2.0(逻辑查询)的更多相关文章
- 【读后感1】SQL2008技术内幕- SQL逻辑查询处理
引言观点 1. 编程语言日新月异,但是从没有人否定sql 在现代编程中的巨大作用和 持续的可利用性.SQL以对人类友好的阅读体验提供数据查询能力( 相比其他编程语言 ), 同时在各种数据库平台中,基础 ...
- MySQL查询处理——逻辑查询处理和物理查询处理
对于查询处理,可将其分为逻辑查询处理和物理查询处理.逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表MySQL数据库是如何得到结果的. 逻辑查询处理 MySQL真正的执行顺序如下: (8) ...
- 45、SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- 第四篇:记录相关操作 SQL逻辑查询语句执行顺序
http://www.cnblogs.com/linhaifeng/articles/7372774.html 一 SELECT语句关键字的定义顺序 SELECT DISTINCT <selec ...
- SQL逻辑查询语句执行顺序
阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SELECT语句关键字的定义顺序 SELE ...
- 9、SQL逻辑查询语句执行顺序
本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...
- SQL逻辑查询语句执行顺序 需要重新整理
一.SQL语句定义顺序 1 2 3 4 5 6 7 8 9 10 SELECT DISTINCT <select_list> FROM <left_table> <joi ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- mysql SQL 逻辑查询语句和执行顺序
关键字的执行优先级(重点) fromwheregroup byhavingselectdistinctorder bylimit 先创建两个表 CREATE TABLE table1 ( custom ...
随机推荐
- traceroute命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/peida/archive/2013/03/07/2947326.html 通过traceroute我们可以知道信息从你 ...
- TeamWork#3,Week5,Introduction to the "take-away" Sale Selection Project
一.NABCD 1.N(Need 需求) 当今社会生活节奏快,很多大学生.上班族叫外卖比较普遍,外卖生意异常火爆.最近美团.饿了么等外卖服务竞争激烈,产生了大量外卖优惠信息.而网络上外卖信息比较混乱, ...
- 针对网站的UI分析
PM对项目所有功能的把握,特别是UI 最差的UI,体现了团队的组织架构.其次,体现了产品的内部结构.最好,体现了用户的自然需求. 对于几种浏览器分别进行UI分析, (1)360的界面如今看来比较大众化 ...
- 关于注册github
- java中static使用之静态方法注意点
1.静态方法可以直接调用同类中的静态成员,但是不能直接调用非静态成员,这是为什么呢?大家想一下,静态成员在对象创建之前就要写入内存,所以它在内存中是实实在在的存在的,而非静态还不存在内存中,所以不能调 ...
- 饭来了小组Alpha冲刺阶段记录
一.第一天 日期:2018/6/13 1.1今日完成任务情况以及遇到的问题 侯晓东: 1.完成任务项:具体了解了微信小程序的开发流程,然后大致规划了我们项目的进度和完成节点:汇总组员的进度,写博客:画 ...
- Scrum 项目准备5.0
1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理想线.参考图6. 3.每日立会更新任务板上任务完成情况.燃尽图的实际线,分析项目进度是否在正轨. 每天的 ...
- [转帖]IPV6取代IPV4之路 为何道阻且长?
IPV6取代IPV4之路 为何道阻且长? 经济学人公众号 IPV6作为IPV4的续命神术,从被提出到现今,逾26年之久.而IPV6在中国更是犹抱琵琶半遮面,千呼万唤难出来,IPV6取代IPV4之路,为 ...
- Java 几种调度任务的Timer、ScheduledExecutor、 开源工具包 Quartz、开源工具包 JCronTab
关于Java中的调度问题,是比较常见的问题,一直没有系统的梳理,现在梳理一下 注意:Quartz的例子 需要在特定的版本上执行,不同的版本使用方法不同,但是总的来说方法大同小异.本例子的版本是1.8 ...
- UpdateBatch到底是怎么用的?
要使用ADOQuery的UpdateBatch函数,必须将ADOQuery的LockType属性设置成ltBatchOptimistic