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

news2024/12/24 21:12:52

一、运行效果图

在这里插入图片描述

二、代码示例

#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.coloradmin.cn/o/1525228.html

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

相关文章

【Leetcode每日一题】 递归 - 两两交换链表中的节点(难度⭐)(38)

1. 题目解析 题目链接&#xff1a;24. 两两交换链表中的节点 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、理解递归函数的含义 首先&#xff0c;我们需要明确递归函数的任务&#xff1a;给定一个链表&#xf…

Matlab|【免费】基于半不变量的概率潮流计算

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要内容是基于半不变量法的概率潮流&#xff0c;包含蒙特卡洛模拟法、半不变量法&#xff0b;Gram-Charlier级数展开以及半不变量法Cornish-Fisher级数展开三种方法以及效果对比&#xff0c;模型考虑了…

【AIGC工具】图片转3d模型

一个在线可以将图片转成3d模型的工具网站 有图形化界面 直接上传图片即可 网站地址&#xff1a; https://huggingface.co/spaces/Zhengyi/CRM

一文读懂systemd

文章目录 背景知识为何而来替代了什么init的缺点 systemd的系统架构图systemd (PID 1):systemd-journald:systemd-logind:systemd-udevd:systemd-networkd:systemd-resolved:systemd-timedated: systemd包括了哪些systemctljournalctlloginctlhostnamectltimedatectllocalectlm…

ngnix安装配置

通过yum -y install nginx的方式&#xff0c;有时候会出现No package nginx available的报错。迟迟无法解决。此时要通过下载安装包的方式安装。 1、下载安装包&#xff1a;官方网址 2、解压缩&#xff1a; tar -xzvf nginx-1.23.4.tar.gz cd nginx-1.23.4.tar.gz 3、源码包…

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

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

【赠书第20期】AI绘画与修图实战:Photoshop+Firefly从入门到精通

文章目录 前言 1 入门篇&#xff1a;初识Photoshop与Firefly 2 进阶篇&#xff1a;掌握Photoshop与Firefly的核心技巧 3 实战篇&#xff1a;运用Photoshop与Firefly进行创作 4 精通篇&#xff1a;提升创作水平&#xff0c;拓展应用领域 5 结语 6 推荐图书 7 粉丝福利 前…

nginx 基本使用、借助 nginx 和 mkcert 实现本地 https://localhost 测试。

CSDN 如何将资源设置为免费&#xff1f; 安装和基本使用 进入 nginx 官网 下载 Mainline version 版本 解压到一个你喜欢的位置&#xff0c;比如解压到 C: 目录 不管配不配置环境变量&#xff0c;对 nginx 的所有操作都应该在对应文件夹中 基本命令的使用&#xff1a; cd …

C#装箱和拆箱

一&#xff0c;装箱 装箱是指将值类型转化为引用类型。 代码如下&#xff1a; 装箱的内部过程 当值类型需要被装箱为引用类型时&#xff0c;CLR&#xff08;Common Language Runtime&#xff09;会为值类型分配内存&#xff0c;在堆上创建一个新的对象。值类型的数据会被复…

长连接技术

个人学习记录&#xff0c;欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

TCP-IP 知识汇总

开放式系统互联模型------国际化标准组织ISO提出----协议组&#xff08;协议模型&#xff09; 应用层&#xff1a;接收用户数据&#xff0c;人机交互的接口 表示层&#xff1a;将编码转换为二进制&#xff08;加密、解密&#xff09;---统一格式 会话层&#xff1a;针对传输…

GEE:调用 Assets 中的数据

本文将介绍在 Google Earth Engine&#xff08;GEE&#xff09;平台上调用 Assets 中的数据的方法和代码。 文章目录 一、下载和保存1.1 保存影像数据到Assets1.2 保存矢量数据到Assets 二、调用2.1 调用影像2.2 调用矢量 三、数据路径获取3.1 数据路径 一、下载和保存 下载数…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出&#xff0c;输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息&#xff0c;带有数据类型和数…

【Numpy】练习题100道(51-75题)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# Git-hub链接 目录 1.题目列表 2.题解 1.题目列表 51. 创建一个表示位置&#xff08;x,y&#xff09;和颜色&#xff08;r,g,b&#xff09;的结…

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统演示 摘要 图书管理系统&#xff0c;是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为&#xff1b;帮助企业实现其规划目标。 图书馆管理系统&#xff0c;能…

Python错题集-9PermissionError:[Errno 13] (权限错误)

1问题描述 Traceback (most recent call last): File "D:\pycharm\projects\5-《Python数学建模算法与应用》程序和数据\02第2章 Python使用入门\ex2_38_1.py", line 9, in <module> fpd.ExcelWriter(data2_38_3.xlsx) #创建文件对象 File "D:…

2024全新返佣商城分销商城理财商城系统源码 全开源PHP+VUE源码

2023全新返佣商城分销商城理财商城系统源码 全开源PHPVUE源码 程序安装环境要求&#xff1a; nginx1.16 php7.2 mysql5.6 程序全开源PHPVUE源码 有需要测试的老铁&#xff0c;拿去测试吧

每日学习笔记:C++ STL 的无序容器(unordered_set、unordered_map)

定义 特性 能够快速查找元素 操作函数 负载系数 元素个数 / bucket个数 提供哈希函数 提供等价准则 方法一&#xff1a;重写元素的操作符 方法二&#xff1a;自定义函数对象

【PyTorch】进阶学习:一文详细介绍 torch.save() 的应用场景、实战代码示例

【PyTorch】进阶学习&#xff1a;一文详细介绍 torch.save() 的应用场景、实战代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

simulink汽车动力特性模型

1、内容简介 略 76-可以交流、咨询、答疑 simulink汽车动力特性模型 节气门、Gasoline Engine、离合器、作动器 2、内容说明 略 齿轮半径1 0.06; 齿轮半径2 0.072; 有效齿轮半径 2/3*(radius2^3 - radius1^3)/(radius2^2 - radius1^2); 输入传动比 2.1; 输出传动比 1…