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

需求

程序读取用户指定的任意文本文件,允许用户从该文件中查找单词。查询结果是该单词出现的次数,并列出每次出现所在行,如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推。例如,以本章的内容作为文件输入,然后查找单词“element”。输出的前几行应为:

element occurs 125 times
(line 62) element with a given key.
(line 64) second element with the same key.
(line 153) element |==| operator.
(line 250) the element type.
(line 398) corresponding element.
后面省略了大约 120 行。

 

看着书上的例子,自己写了下,大致思路是

读取文件,将文件以行为单位,放入vector<string>,再遍历vector<string>,将每行每个单词读入map< string,set<unsigned> >中,最后从map中查找读取

 

注意的地方

程序是不区分大小写的,还需要去掉文章中的标点需要调用函数

头文件#include<cctype>

ispunct() 检查是否是非空格、非数字和非英文字母,类似函数isspace,isdigit,isalpha

tolower() 把字符转换成小写字母

对const成员的迭代器需要用const_iterator

 

对于内置类型,和长度比较短(8字节以内)的浅层结构,类等对象,传值比传引用效率更高。

对超过8字节的对象,一般传引用效率更高。

但实际上传引用或传值的选择,主要取决于功能需求而非效率需求。

 

详解

获取文件对象:

1 ifstream& open_file(ifstream &in,const string &file)
2 {
3     in.close();
4     in.clear();
5     in.open(file.c_str());
6     return in;
7 }

 

读文件,创建vector和map

 1 void TextQuery::read_file(ifstream &in)
 2 {
 3     store_file(in);
 4     build_map();
 5 }
 6 
 7 void TextQuery::store_file(ifstream &in)
 8 {
 9     string textline;
10     while(getline(in,textline))
11         lines_of_text.push_back(textline);
12 }
13 
14 void TextQuery::build_map()
15 {
16     for(line_no line_num = 0;line_num != lines_of_text.size();line_num++)
17     {
18         istringstream line(lines_of_text[line_num]);
19         string word;
20         while(line >> word)
21         {
22             word = cleanup_str(word);
23             word_map[word].insert(line_num);
24         }
25 
26     }
27 }

 

处理单词中的符号,忽略大小写

 1 string TextQuery::cleanup_str(const string &word)
 2 {
 3     string ret;
 4     for(string::const_iterator it = word.begin();it != word.end();++it)
 5     {
 6         if(!ispunct(*it))
 7             ret += tolower(*it);
 8     }
 9     return ret;    
10 }

 

查找单词,返回值是map的第二个元素set,用来保存单词所在的行号

1 set<TextQuery::line_no> TextQuery::run_query(const string &query_word) const
2 {
3     map< string,set<line_no> >::const_iterator loc = word_map.find(query_word);
4     if( loc == word_map.end() )
5         return set<line_no>();    //找不到返回空的set对象
6     else
7         return loc ->second;
8 }

 

返回查找结果,这里有个漏洞,查找单词的数目是为单词所出现的行数(因为set不存储重复元素)

void TextQuery::print_result(set<line_no> locs,const string &query_word)
{cout<<query_word<<":"<<locs.size()<<endl;set<line_no>::iterator it = locs.begin();while(it != locs.end()){cout<<"(line "<<*it+1<<") ";cout<<lines_of_text[*it]<<endl;it++;}
}

 

写了两个辅助函数,并未调用,为了查看vector和map中的内容

 1 void TextQuery::show_vec()
 2 {
 3     vector<string>::iterator ite = lines_of_text.begin();
 4     while(ite != lines_of_text.end())
 5         cout<<*ite++<<endl;
 6 }
 7 void TextQuery::show_map()
 8 {
 9     map< string,set<line_no> >::iterator loc = word_map.begin();
10     while(loc != word_map.end())
11     {
12         cout<<loc->first<<"\t";
13         set<line_no>::iterator it = (loc->second).begin();
14         while(it != (loc->second).end())
15         {
16             cout<<*it + 1<<" ";
17             it++;
18         }
19         cout<<endl;
20         loc++;
21     }
22 }

运行结果

 

代码点此下载

转载于:https://www.cnblogs.com/raichen/p/4900308.html

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

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

相关文章

Anaconda 安装操作及遇到的坑

最近刚用Pytorch&#xff0c;编译开源代码的时候发现缺少n个package&#xff0c;原来是之前在Anaconda3 创建的虚拟环境各自是独立的&#xff0c;tensorflow下安装的不能在别的环境下使用&#xff0c;所以要重新安装。然而关键是国内各种屏蔽资源&#xff0c;无法FQ去直接下载安…

IE浏览器历史版本图标大全

上个月IE团队庆祝了IE的15周岁生日&#xff0c; 并晒了晒IE各个历史版本的图标&#xff1a; Internet Explorer 1.0 图标 Internet Explorer 2.0 图标 Internet Explorer 3.0 图标 Internet Explorer 4.0 图标 Internet Explorer 5.0 图标 Internet Explorer 6.0 图标 Internet…

7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

视频地址&#xff1a;http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询&#xff0c;当然你也可以用包装类来实现。不过这里不说&#xff0c;做关联查询的步骤可以简单的总结为以下的几步&#xff1a;…

ANSYS——查看某一截面的云图分布(也叫做切片图)

1.确定截面的位置 此处以图中红色处截面为例 2.将工作平面经过坐标变化移动到指定截面处(工作平面的XY平面与截面重合) 工作平面坐标系默认是与总体坐标系重合的,这里是先平移再进行旋转

深度学习之keras (一) 初探

之前一段时间里&#xff0c;学习过tensorflow和Pytorch也写了点心得&#xff0c;目前是因为项目原因用了一段时间Keras&#xff0c;觉得很不错啊&#xff0c;至少从入门来说对新手极度友好&#xff0c;由于keras是基于tensoflow的基础&#xff0c;相当于tensorflow的高级API吧&…

swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...

swift&#xff1a;高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符&#xff0c;Swift还有许多复杂的高级运算符&#xff0c;包括了C语和Objective-C中的位运算符和移位运算。 不同于C语言中的数值计算&#xff0c;Swift的数值计算默…

收集、报告或保存系统活动信息:sar命令

2019独角兽企业重金招聘Python工程师标准>>> 索引 sar命令的使用常用方法 查看网络设备&#xff08;网卡&#xff09;的状态信息查看socket使用情况查看cpu使用情况(默认)查看内存和交换空间使用情况查看内存的统计信息查看tty设备的活动状态查看等待运行的进程数和…

【GOF23设计模式】原型模式

【GOF23设计模式】原型模式 来源&#xff1a;http://www.bjsxt.com/ 一、【GOF23设计模式】_原型模式、prototype、浅复制、深复制、Cloneable接口 浅复制 1 package com.test.prototype;2 3 import java.util.Date;4 5 /**6 * 浅复制7 */8 public class Sheep implements C…

Deepfacelab 小白教程

不小心入了AI换脸的坑&#xff0c;但是感觉AI换脸很有意思&#xff0c;第一次感觉科研使我快乐。 目录 一、AI换脸软件简介 二、Deepfacelab下载安装 三、Deepfacelab Demo实现 四、Deepfacelab 填坑 五、总结 一、AI换脸软件简介 这个没有具体使用过&#xff0c;目前我…

Underscore.js 的模板功能

Underscore是一个非常实用的JavaScript库&#xff0c;提供许多编程时需要的功能的支持&#xff0c;他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能。 无论你写一段小的js代码&#xff0c;还是写一个大型的HTML5应用&#xff0c;underscore都能帮上忙。目前&…

ANSYS——查看剖面图的应力分布云图以及工作平面的相关设置

剖面图和切片图其实差不多,只是切片图只有一个截面,而剖面图是切去一部分保留另一部分模型,不但可以看到截面处应力分布还可以看到剩余模型的应力分布 切片应力云图可见:https://blog.csdn.net/qq_45769063/article/details/106357700 1.剖面云图的查看 首先将工作平面的…

2016.8.2

高端内存映射方式 高端内存映射分为三种&#xff1a;永久映射、临时映射和非连续动态内存映射。高端内存一般是指896MB以上的页框&#xff0c;这段区间内核一般不能直接访问。 1.永久映射 永久内核映射允许内核建立高端页框到内核地址空间的长期映射。它们使用主内核页表中的一…

深度学习之pytorch(三) C++调用

玩深度学习&#xff0c;个人觉得基于anaconda的python适合开发与测试&#xff0c;C适合实际的工程部署&#xff01;而pytorch官方有编译好的libtorch&#xff0c;特别方便&#xff0c;适合于我这样的伸手党和手残党(win10下编译tensorflow编译了好久都没通过&#xff0c;好忧伤…

机器学习(一) 基于sklearn库的数据集划分(交叉验证)

机器学习中首要环节就是数据集的处理&#xff0c;其中数据集的处理从个人理解(如有错误敬请谅解)的角度来说包括两个方面&#xff1a;数据集划分和数据清理。其中数据集划分是指训练集、验证集和测试集的数据类别划分&#xff1b;数据清理是指数据的清洗、删除等等方面。这两天…

敏捷项目开源管理软件ScrumBasic(2)- 多项目支持

1.加入Project对象模型 public class Project{[Key][MaxLength(32)]public string ID { get; set; }public string Name { get; set; }public int Order { get; set; }public ICollection<UserStory> Stories { get; set; }public ApplicationUser Creator { get; set; }…

postgresql表和列注释(描述)

2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL添加表和列注释。本文为测试表test&#xff0c;默认无注释。 test# \d关联列表架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 -------------------------------------------------public | test | …

Fifth scrum meeting - 2015/10/30

概述 从昨天开始&#xff0c;我们的开发工作终于进入了正轨&#xff0c;由于之前没有mooc服务器API接口&#xff0c;一些工作无法进行。 因为我们团队开始开发较晚&#xff0c;因此我们将开发阶段的截至时间定为了下周五&#xff0c;测试阶段则压缩为下周周六和周日两天。 我们…

计算机加入域 不能访问网络位置 解决办法

计算机加入域 不能访问网络位置 解决办法 启动以下服务 本文转自 onesthan 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/91xueit/1660286&#xff0c;如需转载请自行联系原作者

Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下&#xff1a; 景物(SCENE)通过镜头&#xff08;LENS&#xff09;生成的光学图像投射到图像传感器(Sensor)表面上&#xff0c;然后转为电信号&#xff0c;经过A/D&#xff08;模数转换&#xff09;转换…

win10 下pycharm+anaconda 编译生成pyd文件

由于生产部署的问题&#xff0c;需要把用python写的深度学习代码编译为可被调用的文件。上网搜索了下&#xff0c;暂时了解到win10下pyd文件比较流行。下面是直接引用某位博主的结论&#xff0c;个人感觉总结的很好。其中Cython库将已有的Python代码转化为C语言的代码&#xff…