Menu
CoddyTech

回顾:词频

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 75 课,共 104 课。

challenge icon

挑战

简单

我们来构建一个词频分析器,用来处理文本并按频率排序显示词语计数。这是一项经典的文本处理任务,能综合运用你学过的所有 STL 组件:用 map 计数,用 vector 排序,用迭代器遍历,并用 lambda 编写自定义排序逻辑。

你需要将代码分成两个文件:

  • WordAnalyzer.h:定义一个用于管理词语计数和分析的 WordAnalyzer 类。

    你的类应在内部使用 std::map<std::string, int> 存储词语计数。实现以下方法:

    • addWord(const std::string& word):增加指定词语的计数
    • getCount(const std::string& word):返回指定词语的计数(如果未找到,则返回 0)
    • getTotalWords():返回添加的词语总数(所有计数之和)
    • getUniqueWords():返回不同词语的数量(映射的大小)
    • printByFrequency():按频率降序打印所有词语。频率相同的词语按字母顺序排序。每行应显示:word: count

    要实现 printByFrequency(),你需要将映射中的内容转移到一个由键值对组成的向量中,然后使用 std::sort 和一个 lambda,先按计数降序比较,计数相同时再按词语升序比较。

  • main.cpp:读取第一行的整数 n,表示接下来有多少个词语。然后读取 n 个词语,每行一个。

    创建一个 WordAnalyzer,添加所有词语,然后显示:

    1. 打印 Total words: <count>
    2. 打印 Unique words: <count>
    3. 打印 Word frequencies:,然后调用 printByFrequency()

例如,输入:

7
apple
banana
apple
cherry
banana
apple
date

输出应为:

Total words: 7
Unique words: 4
Word frequencies:
apple: 3
banana: 2
cherry: 1
date: 1

注意,apple 排在最前面(频率最高),接着是 banana,然后 cherry 和 date 的计数相同,因此按字母顺序排序。

再看一个输入示例:

5
the
cat
the
sat
the

输出:

Total words: 5
Unique words: 3
Word frequencies:
the: 3
cat: 1
sat: 1

亲手试试

#include <iostream>
#include <string>
#include "WordAnalyzer.h"

using namespace std;

int main() {
    int n;
    cin >> n;
    
    WordAnalyzer analyzer;
    
    // TODO: 读取 n 个单词,并将它们添加到 analyzer 中
    
    // TODO: 输出 "Total words: <count>"
    
    // TODO: 输出 "Unique words: <count>"
    
    // TODO: 输出 "Word frequencies:",并调用 printByFrequency()
    
    return 0;
}

面向对象编程中的所有课

自己练习: C++ 在线编译器