您的位置:首页 > 编程语言 > C语言/C++

C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30

2018-01-04 23:50 495 查看
// TextQueryBook,QueryResultBook类的定义.h文件
#ifndef TEXTQUERYBOOK_H
#define TEXTQUERYBOOK_H
#include<memory>
#include<vector>
#include<string>
#include<map>
#include<set>
#include<fstream>
#include<sstream>
class QueryResultBook;
class TextQueryBook
{
public:
using line_no = std::vector<std::string>::size_type;
TextQueryBook(std::ifstream&);
QueryResultBook query(const std::string&) const;
private:
std::shared_ptr<std::vector<std::string>> file; //输入文件
std::map<std::string, std::shared_ptr<std::set<line_no>>> wm;//每个单词到到它所在行号的集合的映射
};

class QueryResultBook
{
friend std::ostream& print(std::ostream&, const QueryResultBook&);
public:
using line_no = std::vector<std::string>::size_type;
QueryResultBook(std::string s,
std::shared_ptr<std::set<line_no>> p,
std::shared_ptr<std::vector<std::string>> f):
sought(s), lines(p), file(f) { }
private:
std::string sought;  //查询单词
std::shared_ptr<std::set<line_no>> lines; //出现的行号
std::shared_ptr<std::vector<std::string>> file; //输入的文件
};
#endif

// TextQueryBook,QueryResultBook类的实现.cpp文件

#include "TextQueryBook.h"

using namespace::std;
TextQueryBook::TextQueryBook(ifstream& infile):file(new vector<string>)    //创建一个file的指针,指向空的vector<string>
{
string str;
while (getline(infile, str))
{
file->push_back(str);
int num = file->size()-1;  //当前行号
istringstream istr(str);
string word;
while (istr >> word)
{
auto &line = wm[word];  //line为行号的set的指针,如果word是第一次出现,则先添加word后绑定,否则直接line和指针绑定
if (!line) //如果指向的是空对象,说明此word还没有创建新的set,要创建新的set,为后续插入行号做准备
line.reset(new set<line_no>);//重新分配对象给line
line->insert(num);              //如果一个单词在一行中出现多次,则只记录一次
}
}
}
QueryResultBook TextQueryBook::query(const string& word) const
{//查询单词,把结果传给QueryResult
auto ret = wm.find(word);
if (ret != wm.end())
return QueryResultBook(word, ret->second, file);
else
{
static shared_ptr<set<line_no>> p(new set<line_no>);
return QueryResultBook(word,p,file);
}
}
string make_plural(size_t ctr,const string &word,const string &ending)
{
return(ctr > 1) ? word + ending : word;
}
ostream  &print(ostream& out, const QueryResultBook& qr)
{
out << qr.sought << " occurs " << qr.lines->size() << make_plural(qr.lines->size(), "times", "s") << endl;
for (auto wq = qr.lines->begin(); wq != qr.lines->end(); ++wq)
{
out << "(line " << *wq + 1 << ")" << *(qr.file->begin() + *wq) << endl;
}
return out;
}
//测试文件.cpp
#include<iostream>
#include "TextQueryBook.h"
using namespace std;

void RunQueries(ifstream &infile)
{
TextQueryBook tq(infile);
while (true)
{
cout << "enter word to look for,or q to quit: ";
string s;
if (!(cin >> s) || s == "q") break;
print(cout, tq.query(s))<< endl;
}
}
int main()
{
ifstream infile("wordtext.txt");
RunQueries(infile);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐