//文件 functions.cc#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <fstream>
#include <map>
#include <set>
#include <sstream>
#include "textquery.h"
#include "resultquery.h"
#include "strblob.h"
using namespace std;
TextQuery::TextQuery()= default;
TextQuery::TextQuery(ifstream &is){string text;while(getline(is,text)){file.push_back(text);int n = file.size() - 1;istringstream line(text);string word;while(line >> word){auto &lines = wm[word];if(!lines)//我们在第一次遇到这个单词时,这个指针是空的lines.reset(new set<line_no>);//分配一个新的空间lines->insert(n);}  }
}
QueryResult TextQuery::query(const string &sought)const
{shared_ptr<set<TextQuery::line_no>> nodata(new set<TextQuery::line_no>);auto loc = wm.find(sought);if(loc == wm.end())return QueryResult(sought,nodata,file);//not foundelsereturn QueryResult(sought,loc->second,file);
}ostream &print(ostream &os,const QueryResult &qr)
{
os << qr.sought << " occurs " << qr.lines->size() << " "<<make_plural(qr.lines->size(),"times","s") << endl;
for(auto num : *qr.lines)os << "\t(line " << num + 1 << ") " << (*qr.file.Data())[num] << endl; return os;  }const string make_plural(size_t i,const string &s,const string&ch)
{
if(i > 1)return s + ch;
else return s;
}StrBlob::StrBlob(initializer_list<string> l1):data(make_shared<vector<string>>(l1)){}
string &StrBlob::front(){return data->front();}
string &StrBlob::back(){return data->back();
}
const string &StrBlob::front()const {return data->front();}
const string &StrBlob::back()const{return data->back();}
size_t StrBlob::size()const{return data->size();}
bool StrBlob::empty()const{return data->empty();}
void StrBlob::push_back(const string &s)
{data->push_back(s);
}
string StrBlob::pop(){
string s = data->back();
data->pop_back();
return s;
}
//main.cc#include <string>
#include <iostream>
#include <fstream>
#include <memory>
#include <vector>
#include "textquery.h"
#include "resultquery.h"
#include "strblob.h"
using namespace std;
int main()
{
ifstream in("data.txt");
TextQuery t(in);
QueryResult q = t.query("bye");
print(cout,q);
print(cout,t.query("are"));
for (auto i = t.query("are").begin();i != t.query("are").end();++i)cout << *i << endl;
StrBlob s = q.get_file();
//尝试下打印文件内容
for(auto i = s.Data()->begin();i != s.Data()->end();++ i)cout << *i << endl;return 0;
}
//文件resultquery.h#ifndef RESULTQUERY_H
#define RESULTQUERY_H#include <string>
#include <vector>
#include <iostream>
#include <memory>
#include <set>
#include <map>
#include "strblob.h"
using namespace std;
class QueryResult{friend ostream & print(ostream &,const QueryResult &);public:
QueryResult():lines(new set<TextQuery::line_no>){}
QueryResult(const string &s,shared_ptr<set<TextQuery::line_no>> p,const StrBlob & f):sought(s),lines(p),file(f){}
set<TextQuery::line_no>::iterator begin()const{return lines->begin();}
set<TextQuery::line_no>::iteratorend()const{return lines->end();}
const StrBlob & get_file()const{return file;}
StrBlob &get_file(){return file;}private:
string sought;  //查询单词
//注意使用的line_no是TextQuery类内定义的类型
shared_ptr<set<TextQuery::line_no>> lines; //出现的行号
StrBlob file;   //输入文件 };
const string make_plural(size_t i,const string &s,const string &ch);ostream &print(ostream &,const QueryResult &);
#endif
//strblob.h#ifndef STRBLOB_H
#define STRBLOB_H#include <iostream>
#include <string>
#include <memory>
#include <vector>using namespace std;
class ResultQuery;
class StrBlob{public:StrBlob():data(make_shared<vector<string>>()){}StrBlob(initializer_list<string> l1);string& front();string& back();const string &front()const;const string &back()const;size_t size()const;bool empty()const;void push_back(const string &);string pop();shared_ptr<vector<string>> Data()const{return data;}private:void check(size_t i,const string &msg);shared_ptr<vector<string>> data;
};#endif
//文件textquery.h#ifndef TEXTQUERY_H
#define TEXTQUERY_H
#include <string>
#include <fstream>
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include "strblob.h"
using namespace std;class QueryResult;
class TextQuery{public:
using line_no = std::vector<string>::size_type;
TextQuery();
TextQuery(ifstream & );
QueryResult query(const string &)const;private:StrBlob file;
map<string,shared_ptr<set<line_no>>> wm;
};#endif

文件data.txt内容如下:

you are good enough are you
you are happy
haha you good
good good enough

运行结果

bye occurs 0 times
are occurs 2 timess(line 1) you are good enough are you(line 2) you are happy
0
1
you are good enough are you
you are happy
haha you good
good good enough

c++ primer文本查询程序 自编加强版(c++primer5th 练习12.32-33)相关推荐

  1. C++自学笔记_文本查询程序_《C++ Primer》

    <C++ Primer> 第10章结束,用一个文本查询程序结束本章 :) 程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在 ...

  2. C++ primer 第12章 12.3 使用标准库:文本查询程序

    文章目录 使用标准库:文本查询程序 文本查询程序设计 数据结构 在类之间共享数据 自己的文本查询程序 书中的文本查询程序 使用标准库:文本查询程序 我们将实现一个简单的文本查询程序,作为标准库相关内容 ...

  3. C++ 容器的综合应用的一个简单实例——文本查询程序

    [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...

  4. c++ primer--容器的综合应用:文本查询程序

    c++ primer–容器的综合应用:文本查询程序 我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在的行.如果某单词在同一行中多 ...

  5. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)

    文章目录 Cpp读入结构性数组 文本查询程序 文本查询程序本版1 Cpp读入结构性数组 #include<sstream> #include<iostream> #includ ...

  6. 15.9 文本查询程序再探(继承)

    本节中使用类的继承方式重写了文本查询程序,支持多种查询策略:或,与,非. 其中Query是提供给用户使用的类,含有两个接口:eval和rep,eval用于查找对应的单词出现的文本,rep用于输出用户指 ...

  7. c++primer 12.3.1文本查询程序

    提示:不完全类型只能在优先的情况下使用,可以定义以这个类型作为函数的参数类型或者函数返回值类型,也可以定义这个类型的指针或者引用. //文件functions.cc #include <stri ...

  8. error: passing ‘const xxx’ as ‘this’ argument discards qualifiers c++primer 5th文本查询程序一个错误请各位指教(已解决)

    文件main.cc 文件main.cc #include <string> #include <iostream> #include <memory> #inclu ...

  9. 容器的综合应用:文本查询程序

    需求 程序读取用户指定的任意文本文件,允许用户从该文件中查找单词.查询结果是该单词出现的次数,并列出每次出现所在行,如果某单词在同一行中多次出现,程序将只显示该行一次.行号按升序显示,即第 7 行应该 ...

最新文章

  1. 演示:思科IPS在线模式下Inline Interface Mode的响应行为(区别各个防御行为)
  2. java 数组降序_Java里的数组降序
  3. 一些意想不到的小bug。
  4. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第9章-固定翼飞行器的编队跟踪与队形旋转控制
  5. SQL Editor and reconnect【mysql(workbench)更新数据时候的一个异常】【Error Code:1175】
  6. Java ByteArrayOutputStream reset()方法及示例
  7. adk linux 64 下载,Homekit HomeKit开源ADK是HomeKit配件开发包的一个开源版本 - 下载 - 搜珍网...
  8. html调后台接口_接口测试平台代码实现62: 多接口用例2
  9. Struts与MVC分层理解
  10. matlab如何设置数值类型,matlab数据类型(数值类型)
  11. Rayman的绝顶之路——Leetcode每日一题打卡18
  12. excel 两列数据合并去重取并集
  13. java继承和接口的区别_java中的接口与继承的区别
  14. bing搜索php,必应bing网页搜索小偷php程序 v1.0PHP小偷采集源码下载-华软网
  15. ArcGIS 10 Desktop 最简安装及完全破解-- 终结者版本
  16. 标准模式和怪异模式指的是什么?
  17. 回归系数(拟合度)与相关系数
  18. python matplotlib设置字体大小_python – Matplotlib表的字体大小
  19. 范登堡(van den berg)CPT使用记录
  20. GM65条形码二维码扫描识别模块与STM32学习

热门文章

  1. SimulatorXcode模拟器如何使用PC键盘进行输入
  2. php 自带过滤和转义函数
  3. iOS开发之时间格式的转化
  4. SQL Server 中的时间算法
  5. mysql accountlevel1_mysql---修改表结构
  6. C# 系统应用之无标题窗体移动的两种方法
  7. C# 数据库dataGridView刷新数据和主外键判断
  8. 【数据结构与算法】之深入解析“K个一组翻转链表”的求解思路与算法示例
  9. 【数据结构与算法】之深入解析“合并K个升序链表”的求解思路与算法示例
  10. HarmonyOS之设备传感器的功能和使用