C++ //练习 12.30 定义你自己版本的TextQuery和QueryResult类,并执行12.3.1节(第431页)中的runQueries函数。

news2024/12/23 13:12:47

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

练习 12.30 定义你自己版本的TextQuery和QueryResult类,并执行12.3.1节(第431页)中的runQueries函数。

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

 

代码块
/*************************************************************************
	> File Name: ex12.30.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;

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 = vector<string>::size_type;
    TextQuery(ifstream &is);
    QueryResult query(const string &s) const;

    private:
    shared_ptr<vector<string>> file;
    map<string, shared_ptr<set<line_no>>> wm;
};

TextQuery::TextQuery(ifstream &is): file(new vector<string>){
    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<vector<string>> f): sought(s), lines(p), file(f) {}

    private:
    string sought;
    shared_ptr<set<TextQuery::line_no>> lines;
    shared_ptr<vector<string>> 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() + num)<<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://www.coloradmin.cn/o/1614447.html

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

相关文章

{“errMsg“:“insertXWebCamera:fail appid privacy api banned“}

问题描述&#xff1a;微信小程序&#xff0c;在体验版本测试时&#xff0c;调用摄像头OK&#xff0c;没有任何问题&#xff0c;部署发布版本后&#xff0c;日志报错内容&#xff1a;{"errMsg":"insertXWebCamera:fail appid privacy api banned"}&#xff…

opencv人脸打马赛克

import cv2def FaceFind(imgPath: str) -> list:image cv2.imread(imgPath)gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 返回人脸坐标列表faces face_cascade.detectMultiScale(gray, scal…

MultiCD工具:创建一个多引导Linux USB驱动器

众所周知&#xff0c;拥有一个可安装多个可用操作系统的 CD 或 USB 驱动器在各种情况下都非常有用。无论是为了快速测试或调试某些内容&#xff0c;还是只是重新安装笔记本电脑或 PC 的操作系统&#xff0c;这都可以为你节省大量时间。 在本文中&#xff0c;将介绍如何使用名为…

高度自定义工业自动化配置:钡铼IOy系列模块广泛应用各行业案例

钡铼IOy系列模块是当今工业自动化领域中备受瞩目的一种设备&#xff0c;其高度自定义的特性使其在各行各业都得到了广泛的应用。无论是在制造业、能源领域还是物流行业&#xff0c;钡铼IOy系列模块都发挥着重要的作用&#xff0c;为企业提高生产效率、降低成本、提升产品质量等…

每日更新的Socks5代理服务推荐

大家好&#xff01;我是一名对于IP代理知识非常熟悉的作者&#xff0c;今天我要为大家介绍的是每日更新的Socks5代理服务推荐。作为一个资深的网络爱好者&#xff0c;我深知在网络世界中保护个人隐私和确保数据安全的重要性。而Socks5代理服务则是一种既能够隐藏我们真实IP地址…

如何获取llama2模型

如何从huggingface快速下载llama2模型_llama2下载-CSDN博客文章浏览阅读1.6k次。【代码】如何从huggingface快速下载模型。_llama2下载https://blog.csdn.net/zh515858237/article/details/131248643?ops_request_misc&request_id&biz_id102&utm_termLlama%202%E6…

代码随想录算法训练营day34

题目&#xff1a;860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球 参考链接&#xff1a;代码随想录 860.柠檬水找零 思路&#xff1a;本题思路比较容易想&#xff0c;主要对于5,10,20三种情况分别讨论&#xff0c;维护三个变量分别记录目前手中三种钞票…

P450焕新而来,室内外两用+路径规划+YOLO点击跟踪,算力高达100TOPS

Prometheus 450&#xff08;简称P450&#xff09;是一款室内室外两用的中型轴距&#xff08;410mm&#xff09;无人机&#xff0c;基于F450基础飞行平台&#xff0c;搭载感知传感器二维平面激光雷达&#xff0c;双目深度相机等&#xff0c;配合软件Prometheus自主无人机系统和S…

GitOps 和 DevOps 有什么区别?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

OpenStack 入门体验

目录 一、云计算概述 1.1、什么是云计算 1.2、云计算的服务模型 1&#xff09;IaaS 2&#xff09;PaaS 3&#xff09;SaaS 1.3、OpenStack 概述 1&#xff09;OpenStack 起源 2&#xff09;什么是 OpenStack 3&#xff09;OpenStack 优势 二、OpenStack 一…

【1569】jsp学生学籍管理系统Myeclipse开发sqlserver数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 学生学籍管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlserver2…

RuoYi-Vue-Plus ()

一、SaInterceptor 注解鉴权和路由拦截鉴权 拦截器&#xff1a;SaInterceptor 实现类位置&#xff1a; cn.dev33.satoken.interceptor.SaInterceptor 功能&#xff1a;Sa-Token 综合拦截器&#xff0c;提供注解鉴权和路由拦截鉴权能力 /*** 创建一个 Sa-Token 综合拦截器&…

2024年新材料与化学工程国际学术会议(ICNMCE 2024)

2024年新材料与化学工程国际学术会议(ICNMCE 2024) 2024 International Conference on New Materials and Chemical Engineering 一、【会议简介】 2024年新材料与化学工程国际学术会议&#xff0c;将汇集全球顶尖学者&#xff0c;展开一场学术盛宴。 在这次会议上&#xff0c…

Git禁止松散对象loose objects弹窗

打开仓库时&#xff0c;弹窗如图 This repository currently has approximately XXXX loose objects.解决办法&#xff1a;见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本&#xff0c;执行git config --global gui.gcwarning false

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…

使用matlab/C语言/verilog分别生成coe文件

之前已经写过一个如何使用matlab生成coe文件&#xff0c;matlab自行运算生成三角波、正弦波等数据&#xff0c;并保存为COE文件。可跳转下面的网址进行查阅。 使用matlab生成正弦波、三角波、方波的COE文件_三角波文件.coe-CSDN博客https://blog.csdn.net/yindq1220/article/d…

如何自动监控WordPress网站的运行状态

近来有不少Hostease的客户来咨询关于监控网站在线情况的方法&#xff0c;确实&#xff0c;尽管我们采取了各方面的措施来维护和保护WordPress网站&#xff0c;网站依然有可能由于一些不可控的原因关闭&#xff0c;这种情况往往事发突然&#xff0c;如果没有提前做好准备&#x…

FloodFill算法简介(用BFS、DFS算法解决)

FloodFill算法中文名&#xff1a;洪水灌溉 FloodFill通常是这样一类问题&#xff0c;如下图&#xff1a; 负数表示凹陷的土地&#xff0c;正数表示凸起的土地&#xff0c;发洪水/下雨会淹没凹陷的地方 通常会问这几种问题&#xff1a; 1.被淹没的区域有几块 2.被淹没的最大…

嵌入式物联网开发基石

前言 嵌入式物联网开发工程师&#xff0c;是一个蓝海新风口&#xff0c;高薪不内卷的行业。需要掌握熟悉c/c、单片机、数据结构&#xff0c;linux系统&#xff0c;ARM单片机&#xff0c;嵌入式。可以从事工作项目loT、视频监控领域的产品&#xff0c;跨平台系统&#xff0c;智能…

联想拯救者电脑数据恢复方法,适用于未备份者

自从大学时期起&#xff0c;我的联想拯救者电脑就成为了我生活和学习的得力助手&#xff0c;里面存有许多至关重要的资料。但是昨日当我启动它时&#xff0c;电脑却意外卡顿。恢复正常后&#xff0c;发现部分数据竟然神秘地消失了&#xff0c;有什么方法能帮我恢复吗&#xff1…