使用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对应的key
                set<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.mfbz.cn/a/465206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

CentOS 7 编译安装 Git

CentOS 7 编译安装 Git 背景来源删除旧版本 Git安装依赖包下载 Git 源代码检验相关依赖&#xff0c;设置安装路径编译安装添加 Git 环境变量重新加载配置文件查看版本号参考文献 背景来源 为什么要安装新版本呢&#xff1f; 因为无聊&#xff0c;哈哈哈&#xff0c;其实也不是…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

DevOps 环境预测测试中的机器学习

在当今快节奏的技术世界中&#xff0c;DevOps 已成为软件开发不可或缺的一部分。它强调协作、自动化、持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;&#xff0c;以提高软件部署的速度和质量。预测测试是这一领域的关键组成部分&#xff0c;其中机器…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统&#xff08;深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化&#xff09;项目概述深度学习长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;机器学习协…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类&#xff08;单例模式&#xff09; 1. 前言 在实际场景中&#xff0c;我们在编写类的过程中总会遇到一些特殊情况&#xff0c;比如设计一个类不…

06.共享内存

1.内存映射&#xff08;mmap&#xff09; 我们在单片机中首先接触到了映射的概念 将一个寄存器的地址映射到了另外的一个存储空间中 内存映射: 内存映射&#xff08;Memory Mapping&#xff09;是一种在计算机科学中使用的技术&#xff0c;它允许将文件或其他设备的内容映射…

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

【SQL】1174. 即时食物配送 II (窗口函数row_number; group by写法;对比;定位错因)

前述 推荐学习&#xff1a; 通俗易懂的学会&#xff1a;SQL窗口函数 题目描述 leetcode题目&#xff1a;1174. 即时食物配送 II 写法一&#xff1a;窗口函数 分组排序&#xff08;以customer_id 分组&#xff0c;按照order_date 排序&#xff09;&#xff0c;窗口函数应用。…

kubernetes-有状态和无状态服务

kubernetes-有状态和无状态服务 kubernetes-有状态和无状态服务1.有状态的应用1.1、理解1.2、特点 2、无状态应用2.1、理解2.2、特点 3、玩一下3.1、启动一个nginx无状态的业务3.2、启动一个nginx有状态的业务 4、无头服务4.1、无头服务的特点&#xff1a;4.2、无头服务的用途&…

力扣每日一题 最小高度树 BFS 双向

Problem: 310. 最小高度树 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue;publ…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

Ps:直接选择工具

直接选择工具 Direct Selection Tool可用于选择和调整路径或形状中的锚点和路径线段。 快捷键&#xff1a;A 直接选择工具的指针形状为白箭头。当需要调整锚点、方向调杆、路径线段以及对选中的多个锚点子路径进行移动、变换&#xff08;缩放、旋转、扭曲、斜切、变形等&#x…

蓝桥杯刷题(十)

1.翻转 代码 输入数据&#xff0c;每组数据进行比较&#xff0c;j的范围掐头去尾&#xff0c;若a[j]b[j]&#xff0c;继续&#xff0c;若出现010,101子串则改成000,111&#xff0c;遍历完后比较a是否等于b&#xff0c;相同则输出次数&#xff0c;不同则输出-1。 for _ in ran…

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;智慧城市作为现代城市发展的新模式&#xff0c;正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为城市的规划、管理、服务等方面带来了革命性的变革。本文…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

百科源码生活资讯百科门户类网站百科知识,生活常识

百科源码生活资讯百科门户类网站百科知识,生活常识 百科源码安装环境 支持php5.6&#xff0c;数据库mysql即可&#xff0c;需要有子目录权限&#xff0c;没有权限的话无法安装 百科源码可以创建百科内容&#xff0c;创建活动内容。 包含用户注册&#xff0c;词条创建&#xff…