这个程序还是比较复杂的,把这句话作为文章的开头可以看出它的真实性.....这篇文章主要介绍了文本查询程序的实现,下面我们一起来看看
15.9的文本查询程序是对12.3节的文本查询程序的扩展,而使用的主要知识也是15章的核心:继承和多态,即面向对象程序设计。
恩,这一节看的过程中,会有很多不理解。特别是在没有把整个程序都看完之前,会有很多疑惑,而看完之后,再思考思考,回头再看本节的前面所写的程序介绍,会有一些感悟。更加清楚这个程序的原理。
TextQuery.h
#ifndef QUERY_TEXTQUERY_H
#define QUERY_TEXTQUERY_H
#include<iostream>
#include<vector>
#include<string>
#include<memory>
#include<map>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<sstream>
#include<algorithm>
#include<fstream>
#include<stack>
using namespace std;
class QueryResult;
// ??????????????????????
class TextQuery
{
public:
using line_no = vector<string>::size_type;
TextQuery(ifstream&); // ?????????????????????????????в????????
QueryResult query(const string&) const; // ???????string???????string???в????
private:
shared_ptr<vector<string>> file; // ???????
map<string, shared_ptr<set<line_no>>> wm; // ???????????????????????к?set??
};
inline TextQuery::TextQuery(ifstream &is): file(new vector<string>) {
string text;
while (getline(is, text)) { // ??????е?????
file->push_back(text); // ????????е????
int n = file->size() - 1; // ???浱????к???????·?????????????shared_ptr<set<line_no>> ?????????к?
istringstream line(text);
string word;
while(line >> word){
auto &lines = wm[word]; // lines?????shared_ptr
if(!lines) // ??????±??????????map?д????????word?????word????????shared_ptr??????shared_ptr???????nullptr;
lines.reset(new set<line_no>);
lines->insert(n);
}
}
}
class QueryResult{
friend ostream& print(ostream& os, const QueryResult& qr);
public:
QueryResult(string s, shared_ptr<set<TextQuery::line_no>> p, shared_ptr<vector<string>> f)
: sought(s), lines(p), file(f) {}
auto begin()const {return lines->begin();}
auto end()const{return lines->end();}
shared_ptr<vector<string>> get_file()const {return file;}
private:
string sought; // ????????
shared_ptr<set<TextQuery::line_no>> lines; // ??????к?
shared_ptr<vector<string>> file; // ???????
};
inline QueryResult TextQuery::query(const string& s)const {
static shared_ptr<set<line_no>> nodata(new set<line_no>()); // ?????????????к?set??shared_ptr
auto loc = wm.find(s);
if(loc == wm.cend())
return QueryResult(s, nodata, file);
else
return QueryResult(s, loc->second, file);
}
inline ostream& print(ostream& os, const QueryResult& qr)
{
os<<qr.sought<<" occurs "<<qr.lines->size()<<" "<<((qr.lines->size()>1)?"times":"time")<<endl;
for(const auto& num: *(qr.lines)){
os << "\t(lines "<<num+1<<") "<<(*(qr.file))[num]<<endl;
}
return os;
}
inline void runQueries(ifstream& infile)
{
// infile?????ifstream??????????????????
TextQuery tq(infile);
// ????????????????????????????????????????????
while(true)
{
cout<<"enter word to look for, or q to quit: "<<endl;
string s;
// ?????????????s=='q'?????
if(!(cin>>s) || s == "q") break;
print(cout, tq.query(s)) << endl;
}
}
inline void independent_word_query(ifstream& ifile){
vector<string> file;
map<string,set<int>> word_map;
string text;
while(getline(ifile, text)){
file.push_back(text);
int n = (int)file.size()-1; // ???push_back?????е??±?
istringstream line(text); // ???string text???????????
string word;
while(line >> word){
word_map[word].insert(n);
}
}
while(true){
cout << "Enter word to look for, or q to quit: "<<endl;
string s;
if(!(cin>>s) || s=="q") break;
const auto& lines = word_map.find(s); // ?????????????????????pair<string,set<int>>
cout<<s<<" occurs "<<(*lines).second.size()<<(lines->second.size()>1?" times":" time")<<endl;
for(const auto& i:lines->second){
cout<<"\t(lines "<<i+1<<") "<<file[i]<<endl;
}
}
}
#endifQuery.h
#ifndef QUERY_QUERY_H
#define QUERY_QUERY_H
#include"TextQuery.h"
class Query_base
{
friend class Query;
protected:
using line_no = TextQuery::line_no; // �����������eval������ʹ�ã�������Ϊprotected��
virtual ~Query_base() = default;
private:
// eval���������뵱ǰQueryƥ���QueryResult
virtual QueryResult eval(const TextQuery&) const = 0;
// rep��ʾ��ѯ��һ��string
virtual string rep() const = 0;
};
class Query
{
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
friend Query operator~(const Query&);
public:
Query(const string&); // ����һ���µ�WordQuery
public:
QueryResult eval(const TextQuery& t)const { return q->eval(t); }
string rep()const { return q->rep(); }
private:
Query(shared_ptr<Query_base> query) :q(query){}
shared_ptr<Query_base> q;
};
//ostream& operator<<(ostream& os, const Query& q)
//{
// // Query::repͨ������Query_baseָ���rep�����������
// return os<<q.rep();
/
沃梦达教程
本文标题为:C++详解Primer文本查询程序的实现
猜你喜欢
- C语言qsort()函数的使用方法详解 2023-04-26
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- ubuntu下C/C++获取剩余内存 2023-09-18
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- Easyx实现扫雷游戏 2023-02-06
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Qt计时器使用方法详解 2023-05-30
