【C++ Primer】文本查询程序再探

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
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值