C++ //练习 12.32 重写TextQuery和QueryResult类,用StrBlob代替vector<string>保存输入文件。

C++ Primer(第5版) 练习 12.32

练习 12.32 重写TextQuery和QueryResult类,用StrBlob代替vector保存输入文件。

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块
/*************************************************************************> File Name: ex12.32.cpp> Author: > Mail: > Created Time: Mon 22 Apr 2024 08:21:38 AM CST************************************************************************/#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
#include<map>
#include<set>
#include<memory>
using namespace std;class StrBlobPtr;class StrBlob{friend class StrBlobPtr;public:typedef vector<string>::size_type size_type;StrBlob(): data(make_shared<vector<string>>()) {}StrBlob(initializer_list<string> il): data(make_shared<vector<string>>(il)) {}size_type size() const { return data->size(); }bool empty() const { return data->empty(); }void push_back(const string &t) { data->push_back(t); }void pop_back();string &front();string &back();string &front() const;string &back() const;StrBlobPtr begin();StrBlobPtr end();private:shared_ptr<vector<string>> data;void check(size_type i, const string &msg) const;
};void StrBlob::pop_back(){check(0, "pop_back on empty StrBlob");data->pop_back();
}string& StrBlob::front(){check(0, "front on empty StrBlob");return data->front();
}string& StrBlob::back(){check(0, "back on empty StrBlob");return data->back();
}string& StrBlob::front() const{check(0, "front on empty StrBlob");return data->front();
}string& StrBlob::back() const{check(0, "back on empty StrBlob");return data->back();
}void StrBlob::check(size_type i, const string &msg) const{if(i >= data->size()){throw out_of_range(msg);}
}class StrBlobPtr{public:StrBlobPtr(): curr(0) {}StrBlobPtr(StrBlob &s, size_t sz = 0): wptr(s.data), curr(sz) {}string &deref() const;StrBlobPtr &incr();StrBlobPtr &add(StrBlob::size_type num);private:shared_ptr<vector<string>> check(size_t, const string &) const;weak_ptr<vector<string>> wptr;size_t curr;
};shared_ptr<vector<string>> StrBlobPtr::check(size_t i, const string &msg) const {auto ret = wptr.lock();if(!ret){throw runtime_error("unbound StrBlobPtr");}if(i >= ret->size()){throw out_of_range(msg);}return ret;
}string &StrBlobPtr::deref() const{auto p = check(curr, "dereference past end");return (*p)[curr];
}StrBlobPtr &StrBlobPtr::incr(){check(curr, "increment past end of StrBlobPtr");++curr;return *this;
}StrBlobPtr &StrBlobPtr::add(StrBlob::size_type num){check(curr + num, "increment past end of StrBlobPtr");curr += num;return *this;
}StrBlobPtr StrBlob::begin(){return StrBlobPtr(*this);
}StrBlobPtr StrBlob::end(){auto ret = StrBlobPtr(*this, data->size());return ret;
}string make_plural(size_t ctr, string &word, const string &ending = "s"){int size = word.size();if(ctr <= 1){return word;}else{if(word[size-1] == 's' || word[size-1] == 'x' || (word[size-1] == 'h' && word[size-2] == 's') || (word[size-1] == 'h' && word[size-2] == 'c')){return word + "e" + ending;}else if(word[size-1] == 'y' && (word[size-2] != 'a' && word[size-2] != 'e' && word[size-2] != 'i' && word[size-2] != 'o' && word[size-2] != 'u')){word[size-1] = 'i';return word + "e" + ending;}else if((word[size-3] != 'a' && word[size-3] != 'e' && word[size-3] != 'i' && word[size-3] != 'o' && word[size-3] != 'u') && (word[size-2] != 'a' && word[size-2] != 'e' && word[size-2] != 'i' && word[size-2] != 'o' && word[size-2] != 'u')){if(word[size-1] == 'f'){word[size-1] = 'v';return word + ending;}else if(word[size-2] == 'f' && word[size-1] == 'e'){word[size-2] = 'v';return word + "e" + ending;}}else{return word + ending;}}return word;
}class QueryResult;class TextQuery{public:using line_no = StrBlob::size_type;TextQuery(ifstream &is);QueryResult query(const string &s) const;private:shared_ptr<StrBlob> file;map<string, shared_ptr<set<line_no>>> wm;
};TextQuery::TextQuery(ifstream &is): file(new StrBlob){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);}}}
}class QueryResult{friend ostream &print(ostream &, const QueryResult &);public:QueryResult(string s, shared_ptr<set<TextQuery::line_no>> p, shared_ptr<StrBlob> f): sought(s), lines(p), file(f) {}private:string sought;shared_ptr<set<TextQuery::line_no>> lines;shared_ptr<StrBlob> file;
};QueryResult TextQuery::query(const string &sought) const{static shared_ptr<set<line_no>> nodata(new set<line_no>);auto loc = wm.find(sought);if(loc == wm.end()){return QueryResult(sought, nodata, file);}else{return QueryResult(sought, loc->second, file);}
}ostream &print(ostream &os, const QueryResult &qr){string na = "time";os<<qr.sought<<" occurs "<<qr.lines->size()<<" "<<make_plural(qr.lines->size(), na)<<endl;for(auto num : *qr.lines){os<<"\t(line "<<num + 1<<") "<<qr.file->begin().add(num).deref()<<endl;}return os;
}void runQueries(ifstream &infile){TextQuery 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 file("12.27.txt");runQueries(file);return 0;
}
运行结果显示如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979118.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Jammy@Jetson Orin - Tensorflow Keras Get Started: 000 setup for tutorial

JammyJetson Orin - Tensorflow & Keras Get Started: 000 setup for tutorial 1. 源由2. 搭建环境2.1 安装IDE环境2.2 安装numpy2.3 安装keras2.4 安装JAX2.5 安装tensorflow2.6 安装PyTorch2.7 安装nbdiff 3. 测试DEMO3.1 numpy版本兼容问题3.2 karas API - model.compil…

STC15L2K60S2-28I-LQFP44 单片机芯片 STC宏晶

STC15L2K60S2-28I-LQFP44 规格信息&#xff1a; 产品类型STC(宏晶) UART/USART2 额定特性- SPI1 USB Device0 USB Host/OTG0 PWM3 I2C&#xff08;SMBUS/PMBUS&#xff09;0 LCD0 工作电压2.4V ~ 3.6V EEPROM 尺度1KB Ethernet0 A/D8x10bit CAN0 D/A3x10bit CPU…

【VI/VIM】基本操作备忘录

简介 新建/打开文件 工作模式 常用命令 补全命令 命令模式输入&#xff1a;ctrl p 移动命令 文本选中 撤销、删除 复制粘贴 替换 缩排 查找 替换 插入 分屏 练习

Spectre-v2 以及 Linux Retpoline技术简介

文章目录 前言一、Executive Summary1.1 Spectre-v2: Branch Predictor Poisoning1.2 Mitigating Spectre-v2 with Retpolines1.3 Retpoline Concept 二、BackgroundExploit Composition 三、(Un-)Directing Speculative Execution四、Construction (x86)4.1 Speculation Barri…

Linux文件权限核心知识

1.1 权限概念 Linux 里面不同 用户 对不同 文件、目录、用户 等对象的控制能力。 1.2 权限属性 ##创建文件 [rootoldboyedu ~]# touch oldboy.txt [rootoldboyedu ~]# ls -l oldboy.txt -rw-r--r-- 1 root root 14 9月 26 10:22 oldboy.txt ##创建目录 [rootoldboyedu ~]# mk…

项目上线流程(保姆级教学)

01&#xff1a;注册阿里云账户 02&#xff1a;登录阿里云 03&#xff1a;在桌面新建记事本保存个人账号密码等信息 04&#xff1a;完成重置密码 05&#xff1a;安装宝塔面板 命令行 yum install -y wget && wget -O install.sh http://download.bt.cn/install/instal…

数据结构之顺序表的实现(C语言版)

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关顺序表的有关知识 所属专栏&#xff1a;数据结构 创作不易&#xff0c;望得到各位佬们的互三呦 一.前言 1.首先在讲顺序表之前我们先来了解什么是数据结构 数据结构是由“数据”和“结构”两词组合⽽来。 什…

Android集成Sentry实践

需求&#xff1a;之前使用的是tencent的bugly做为崩溃和异常监控&#xff0c;好像是要开始收费了&#xff0c;计划使用开源免费的sentry进行替换。 步骤&#xff1a; 1.修改工程文件 app/build.gradle apply plugin: io.sentry.android.gradle sentry {// 禁用或启用ProGua…

将彩色图转化为灰度图及其原理介绍

彩色图介绍 彩色图像是一种包含颜色信息的图像&#xff0c;通常由红色、绿色和蓝色&#xff08;RGB&#xff09;三个颜色通道组成。这三种颜色通道可以叠加在一起来形成各种不同的颜色。 彩色图像中的每个像素都有三个数值&#xff0c;分别表示红色、绿色和蓝色通道的强度或亮…

【数据结构(邓俊辉)学习笔记】绪论04——算法分析

文章目录 0. 前言1. 算法分析2.级数2.1基本形式2.2 收敛级数 3.循环 vs 级数4.示例 0. 前言 通过以基本计算模型作为参照&#xff0c;并且以大O记号的形式在上面添加适当刻度&#xff0c;已经建立一套对DSA进行分析的完整工具和体系。不清楚的可以看看复杂度度量 、复杂度分析…

Mybatisplus LambdaQueryWrapper表达式使用DATE_FORMAT比较日期函数

背景&#xff1a; 最近遇到一个问题&#xff0c;数据库保存的日期字段是如下格式 但是我们需要比较的日期为 2020-08-01格式&#xff0c; 所以我们要将日期格式化 使用 Mybatisplus LambdaQueryWrapper的情况下可用下面的方式做参考 LambdaQueryWrapper<SysDicCode> la…

代码随想录算法训练营DAY35|C++贪心算法Part.4|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录 860.柠檬水找零伪代码实现CPP代码 406.根据身高重建队列思路伪代码实现代码优化 CPP代码 452. 用最少数量的箭引爆气球思路伪代码实现CPP代码 860.柠檬水找零 力扣题目链接 文章讲解&#xff1a;860.柠檬水找零 视频讲解&#xff1a;贪心算法&#xff0c;看上去复杂&a…

Windows系统部署Emby影音服务并实现无公网IP访问本地影视资源

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 本文主要介绍如何在Windows系统中&#xff0c;使用Cpolar内网穿透Emby&#xf…

C++入门(3)

文章目录 C入门auto同一行中定义多个变量auto不能推到的场景基于范围的for循环(C11)10. 指针空值nullptr(C11) C入门 auto auto&#xff1a;C11中&#xff0c;标准委员会赋予了auto全新的含义即&#xff1a;auto不再是一个存储类型指示符&#xff0c;而是作为一个新的类型指示…

linux信号机制分析

概念 信号递达&#xff1a;实际执行信号的处理动作就是信号递达 信号未决&#xff1a;信号从产生到递达之间的状态就是信号未决&#xff08;未决就是没有解决&#xff09; 收到某信号后&#xff0c;把未决信号集中的此信号置为1&#xff08;1表示未解决的信号&#xff09;&a…

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现&#xff1a; Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是&#xff1a;有时在一个交通网络上增加一条路段&#xff0c;或者提高某个路段的局部通行能力&a…

OceanBase V4.2特性解析:用 Show Trace 快速定位数据库性能瓶颈

在数据库日常运维中&#xff0c;当遇到慢SQL问题时&#xff0c;若无法迅速查明原因&#xff0c;将极大地影响用户的使用感受&#xff0c;甚至可能引发业务或服务的中断。相较于单机数据库&#xff0c;分布式数据库系统因其涉及多个节点和多组件的协同工作&#xff0c;集群规模可…

计算IP地址总个数的方法及其应用

IP地址是计算机网络中用于唯一标识和定位设备的数字地址&#xff0c;是Internet Protocol&#xff08;IP&#xff09;的核心组成部分。计算IP地址的总个数是网络规划和管理中的重要任务之一&#xff0c;本文将介绍计算IP地址总个数的方法及其应用。 IP地址查询&#xff1a;IP数…

华为公司战略规划和落地方法之五看三定工具解析【PPT图片】(内含超级福利)

导言 华为公司最厉害之处就是战略上的高举高打&#xff0c;“吹过的牛都实现了”。支撑华为公司战略从规划到落地的主要工具很多&#xff0c;其中“五看三定”是战略规划时最核心的方法之一。本资料将介绍五看三定的核心精髓。欢迎学习&#xff01; 本材料结合谢宁老师专著《华…

【漏洞复现】锐捷 EG易网关 phpinfo.view.php 信息泄露漏洞

0x01 产品简介 锐捷EG易网关是一款综合网关产品&#xff0c;集成了先进的软硬件体系构架&#xff0c;并配备了DPI深入分析引擎、行为分析/管理引擎。这款产品能在保证网络出口高效转发的基础上&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化的日志存储/审计服务。 …