回顾:词频
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 75 课,共 104 课。
挑战
简单我们来构建一个词频分析器,用来处理文本并按频率排序显示词语计数。这是一项经典的文本处理任务,能综合运用你学过的所有 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,添加所有词语,然后显示:- 打印
Total words: <count> - 打印
Unique words: <count> - 打印
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++ 在线编译器