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 ...
随机推荐
- MariaDB远程连接问题
MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...
- lscpi命令详解
基础命令学习目录 lspci是一个用来查看系统中所有PCI总线以及连接到该总线上的设备的工具. 命令格式为 lspci -参数 (不加参数显示所有硬件设备) 至于有哪些参数及其详细用法可以看下这篇博客 ...
- [shell] bash数组(for时排序)
for处理时会自动把顺序按A-Z排序了 [root@XM-v106 ~]# bash b.sh A -> B -> C -> D -> E -> [root@XM-v10 ...
- 安装配置php
安装PHP 1.安装PHP yum install php #根据提示输入Y直到安装完成 2.安装PHP组件,使PHP支持 MySQL.PHP支持FastCG ...
- OO终章--总结博客
一.测试与正确性论证的比较 从方法上看,测试是使用大量测试样例来覆盖测试代码,从而能够检测代码的实现是否正确,功能是否完善.而正确性论证是使用代码的规格和逻辑进行严密的推论和证明,从而验证代码的实现正 ...
- 每日scrum(1)
今天又正式开始了第二个冲刺周期,计划十天,主要需要改进的地方包括UI界面,还有一些细节的把握. 今天出现的主要问题有:在讨论UI界面风格的时候,小组内部意见不统一,对UI界面的创作流程不熟悉,以及难度 ...
- 软工1816 · Beta冲刺(1/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成beta冲刺阶段的任务安排 整理博客 接下来的计划 & 还剩下哪些 ...
- 编程之法section II: 2.1 求最小的k个数
====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...
- raise PDFEncryptionError('Unknown algorithm: param=%r' % param) pdfminer.pdfdocument.PDFEncryptionError: Unknown algorithm
使用pdfminer遇到的pdf文件加密问题: raise PDFEncryptionError('Unknown algorithm: param=%r' % param) pdfminer.pdf ...
- EF 小数位的保留
问题描述:当采用EF的DbContext保存decimal类型数据到数据库,默认只会保存小数点后的前2位小数,其余均置0:例如保存101.182352152322,实际存到数据库里的数据为101.18 ...