textquery.h
#ifndef _TEXTQUERY_H
#define _TEXTQUERY_H
#include <iostream>
#include <map>
#include <set>
#include <fstream>
#include <sstream>
#include <memory>
#include <vector>
#include <string>
#include <algorithm>
class QueryResult; //查询结果类
class TextQuery; //文本查询类
using line_no = std::vector<std::string>::size_type;
//查询结果类
class QueryResult
{
friend class TextQuery;
friend std::ostream &operator<<(std::ostream &os, const QueryResult &q);
public:
QueryResult() = default;
QueryResult(std::string q_word, std::shared_ptr<std::set<line_no>> lines,
std::shared_ptr<std::vector<std::string>> word_file) :
q_word_(q_word), lines_(lines), word_file_(word_file) {}
std::set<line_no>::iterator begin();
std::set<line_no>::iterator end();
std::shared_ptr<std::vector<std::string>> get_file();
private:
std::string q_word_; //要查询的单词
std::shared_ptr<std::set<line_no>> lines_; //出现行号的集合
std::shared_ptr<std::vector<std::string>> word_file_; //单词文件
};
//文本查询类
class TextQuery
{
friend class QueryResult;
public:
TextQuery() = default;
TextQuery(std::ifstream &is);
//查询函数
QueryResult query(const std::string &word) const;
private:
std::shared_ptr<std::vector<std::string>> m_file_; //查询的文本
std::map<std::string, std::shared_ptr<std::set<line_no>>> m_word_line_; //每个单词以及它的行号集合
};
//Query_base抽象基类,制定一个标准
class Query_base
{
friend class Query;
protected:
virtual ~Query_base() = default;
private:
//eval返回与当前TextQuery匹配的QueryResult
virtual QueryResult eval(const TextQuery &) const = 0;
//rep表示查询的一个string
v