使用map和set实现简单的词频统计

一、运行效果图

在这里插入图片描述

二、代码示例

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;class TextQuery {
public:void readFile(const string &filename);void query(const string &word);
private:vector<string> _lines; // 用于保存每一行的内容map<string, set<int>> _wordsNumbers; // 用于保存每个词所在的行号map<string, int> _dict; // 用于保存每个词的词频
};void TextQuery::readFile(const string &filename) {// 打开文件流ifstream ifs(filename);if (!ifs.good()) {ifs.close();cerr << "open " << filename << " is fail" << endl;return;} // 操作数据string line;size_t lineNumber = 0; // 行号while (getline(ifs, line)) {++lineNumber;_lines.push_back(line); // 记录每一行istringstream iss(line);string word;// 一行一行地处理while (getline(iss, word, ' ')) {word.erase(remove_if(word.begin(), word.end(), [](const char c) {return !isalpha(c); // 处理掉非字母部分}),word.end());if (word.size() == 0) { // 跳过空字符continue;}++_dict[word]; // 词频+1// 存入word的行号auto it = _wordsNumbers.find(word);if (it == _wordsNumbers.end()) { // 还没有word对应的keyset<int> numbers;numbers.insert(lineNumber);_wordsNumbers[word] = numbers;} else { // 有对应key,直接插入it->second.insert(lineNumber);}}}// 关闭文件流ifs.close();
}void TextQuery::query(const string &word) {// 先判断是否存在auto dictIt = _dict.find(word);if (dictIt == _dict.end()) {cout << "\"" << word << "\"" << " never appears!" << endl;return;}// 查找数据cout << "\"" << word << "\"" << " occurs " << dictIt->second << ((dictIt->second > 1) ? " times" : " time") << endl;auto wordsNumbersIt = _wordsNumbers.find(word); // 不用再校验for (const auto &lineNumber : wordsNumbersIt->second) {cout << lineNumber << ": ";// 标亮显示行内容istringstream iss(_lines[lineNumber - 1]);string tempWord;while (getline(iss, tempWord, ' ')) {if (word == tempWord) {cout << "\033[31m" << tempWord << "\033[0m" << " ";                } else {cout << tempWord << " ";}}cout << endl;}
}void test0() {TextQuery tq;tq.readFile("./test.txt");string word;while (cout << "请输入要查询的关键字:", getline(cin, word)) {tq.query(word);} cout << endl;
}int main(void) {test0();return 0;
}

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

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

相关文章

LarkXR上新了 | Apollo多终端与XR体验的优化创新

作为领先的数字平行世界产品技术提供方&#xff0c;「Paraverse平行云」一直致力于为企业和开发者提供企业级实时云渲染解决方案。其多终端接入产品LarkXR Apollo&#xff0c;基于底层Runtime技术&#xff0c;实现了在Windows、Linux、MacOS、Android、iOS等多种操作系统下&…

Spark 之ExecutorLostFailure in Apache Spark

错误日志ExecutorLostFailure (executor 34 exited unrelated to the running tasks) Reason: Container container_XXX on host: XXX was preempted. 1. 解释 ExecutorLostFailure Executor丢失: ExecutorLostFailure是一个在Apache Spark集群运行时可能遇到的错误。它表明一…

游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)

游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词&#xff1a;游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…

Samtec科普 | 一文了解患者护理应用连接器

【摘要/前言】 通过医疗专业人士为患者提供护理的种种需求&#xff0c;已经不限于手术室与医院的各种安全状况。当今许多患者的护理都是在其他环境进行&#xff0c;例如医生办公室、健康中心&#xff0c;还有越来越普遍的住家。尤其是需要长期看护的患者&#xff0c;所需的科技…

202006A卷青少年软件编程(Scratch)等级考试试卷(三级)

第1题:【 单选题】 执行以下脚本后舞台上的角色将 ?( ) A:先克隆自身,克隆体出现后被删除 B:先克隆自身,克隆体出现后删除本体 C:克隆出自身后本体与克隆体同时被删除 D:克隆出自身后本体与克隆体被不会被删除 【正确答案】: A 【试题解析】 : 第2题:【 单选题】…

MATLAB环境下基于决策树和随机森林的心力衰竭患者生存情况预测

近年来&#xff0c;随着医学数据的不断积累和计算机技术的快速发展&#xff0c;许多机器学习技术已经被用在医学领域&#xff0c;并取得了不错的效果。与传统的基于医学知识经验的心衰预后评估模型相比&#xff0c;机器学习方法可以快速、高效地从繁杂的、海量的心衰病人数据中…

SSH 批量免密登录服务器

思路&#xff1a;创建密钥&#xff0c;并通过分发公钥文件到其他服务器&#xff0c;从而实现批量免密无交互登录服务器 拓扑结构&#xff1a;主服务器 |----》从服务器1 |----》从服务器2 |----》..... 参考链接&#xff1a;SSH命令批量操作服务器_ssh批量登录远程执行脚本…

【Liunx-后端开发软件安装】Liunx安装nginx

【Liunx-后端开发软件安装】Liunx安装nginx 使用安装包安装 一、简介 nginx&#xff0c;这个家伙可不是你厨房里的那位大厨&#xff0c;它可是互联网世界的“煎饼果子摊主”。想象一下&#xff0c;在熙熙攘攘的网络大街上&#xff0c;nginx挥舞着它的锅铲——哦不&#xff0c;是…

flask 继续学习

group_by group_by是一种在数据库查询或数据处理中常用的操作&#xff0c;它用于将数据按照指定的列进行分组。通过group_by操作&#xff0c;可以将数据集按照某个列的值进行分类&#xff0c;然后对每个分类进行聚合计算或其他操作。 在SQL语言中&#xff0c;group_by通常与聚…

校招:饿了么一面八股

文章目录 1.new String&#xff08;“abc”&#xff09;存在哪里2.序列化和反序列化3.数据结构中堆和栈的区别4面向对象编程三大特征&#xff0c;分别说明5.子类继承类的方法&#xff0c;使用super调用父类的方法&#xff0c;输出的顺序6.多台7Mysql的存储引擎有什么8mysql中有…

你会怎样爱别人

传统经济学中的纯粹利己模型假定人们试图最大化的效用函数不受其他人效用的影响&#xff0c;其他人的行为都是外生的&#xff0c;不用考虑&#xff0c;因此&#xff0c;是一种极为简化的模型&#xff0c;可以便于建模和运用&#xff0c;其功能与完全竞争模型有点像。 与传统经济…

消息队列面试题

目录 1. 为什么使用消息队列 2. 消息队列的缺点 3. 消息队列如何选型&#xff1f; 4. 如何保证消息队列是高可用的 5. 如何保证消息不被重复消费&#xff08;见第二条&#xff09; 6. 如何保证消息的可靠性传输&#xff1f; 7. 如何保证消息的顺序性&#xff08;即消息幂…

总说上下文切换耗性能,那他到底耗了多少性能?

大家好&#xff0c;我是「云舒编程」&#xff0c;今天我们来聊聊上下文切换性能消耗。 文章首发于微信公众号&#xff1a;云舒编程 关注公众号获取&#xff1a; 1、大厂项目分享 2、各种技术原理分享 3、部门内推 一、前言 众所周知&#xff0c;操作系统是一个分时复用系统&…

.NET高级面试指南专题十九【 数据库设计-4范式】

数据库范式设计是关系数据库设计中的重要概念&#xff0c;旨在减少数据冗余和提高数据的一致性。 范式设计的目的是提高数据库的数据质量、一致性和可维护性。通过将数据结构化为不同的范式&#xff0c;可以降低数据冗余&#xff0c;减少数据更新异常&#xff0c;提高数据的可靠…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么&#xff1f;它与 MyBatis 有什么区别&#xff1f; MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架&#xff0c;它提供了一系列增强功能&#xff0c;简化了 MyBatis 的使用。 与 MyBatis 相比…

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 &#xff08;1&#xff09;cout输出流 &#xff08;2&#xff09;endl操纵符 &#xff08;3&#xff09;cin输入流 二、C表达式和控制语句 1、数据机构 特别&#xff1a;布尔类型bool 2、算数运…

处理Centos 7 中buff/cache高的问题

在CentOS 7中,如果发现 buff/cache 栏目的值过高占用了大量内存,可以尝试以下方法来释放部分缓存: 清理页面缓存 Linux内核会缓存最近使用过的内存页面,以提高访问速度。你可以使用以下命令清理页面缓存: sudo sync && sudo echo 1 > /proc/sys/vm/drop_caches …

Leetcode 3082. Find the Sum of the Power of All Subsequences

Leetcode 3082. Find the Sum of the Power of All Subsequences 1. 解题思路2. 代码实现 题目链接&#xff1a;3082. Find the Sum of the Power of All Subsequences 1. 解题思路 这一题的话其实反而还好&#xff0c;就是一个比较常规的动态规划的题目。 我们首先需要想明…

数据结构的基本框架以及泛型

目录 集合框架复杂度大O的渐进表示法 装包(箱)或者拆包(箱)装包拆包 泛型泛型的上界泛型方法求最大值 集合框架 Java的集合框架,Java Collection Framework 又被称为容器container, 定义在java.util包下的一组 interfaces 和其实现类 classes interface: 接口 abstracb class…

【LeetCode热题100】24. 两两交换链表中的节点(链表)

一.题目要求 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&am…