单词频率统计器
使用 std::map 统计文本文件中每个单词出现的次数
单词频率统计器 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
项目目标
读取一个文本文件,打印每个不重复单词及其出现次数。使用 std::map 或 std::unordered_map 即可简洁地解决这一经典问题。
所需头文件
文件输入/输出、字符串和关联容器。
#include <fstream>
#include <map>
#include <string>
#include <iostream>一次读取一个单词
>> 提取运算符会读取以空白分隔的标记——非常适合读取原始单词。
std::ifstream file("book.txt");
std::map<std::string, int> counts;
std::string word;
while (file >> word) {
counts[word]++;
}规范化单词
将每个单词转换为小写,这样 “Hello” 和 “hello” 会被视为相同。
#include <algorithm>
std::transform(word.begin(), word.end(), word.begin(),
[](unsigned char c) { return std::tolower(c); });去除标点符号
从每个单词的开头和结尾去除标点符号。
while (!word.empty() && !std::isalpha(word.front())) word.erase(0,1);
while (!word.empty() && !std::isalpha(word.back())) word.pop_back();打印计数
遍历映射并打印每一对键和值。std::map 会按照键的排序顺序进行遍历。
for (const auto& [w, n] : counts) {
std::cout << w << ": " << n << "\n";
}按频率排序
如果不想按字母顺序而是按出现频率打印,请将条目复制到 vector 中并进行排序。
std::vector<std::pair<std::string, int>> entries(counts.begin(), counts.end());
std::sort(entries.begin(), entries.end(),
[](auto& a, auto& b) { return a.second > b.second; });出现次数最多的前 N 项
只打印排序后的 vector 中排名前 10 的项(或前 N 项)。
for (size_t i = 0; i < 10 && i < entries.size(); ++i) {
std::cout << entries[i].first << ": " << entries[i].second << "\n";
}map 与 unordered_map 的比较
对于大型文件,std::unordered_map 平均速度更快(查找复杂度为 O(1)),但遍历顺序任意。需要排序输出时,请使用 std::map。
停用词
使用停用词集合过滤掉 “the”、“and”、“of” 等常见的短单词。
static const std::set<std::string> stop = {"the","and","of","to","a"};
if (stop.count(word)) continue;统计行数或字符数
这是同一种模式的变体:使用 std::getline 统计总行数,使用 std::ifstream + std::istreambuf_iterator 统计总字符数。
性能考量
对于超大型文件,请使用以 string_view 为键的 unordered_map,将文件映射到内存,并避免为每个单词进行堆分配。
快速检查
哪个容器会自动按照字母顺序进行遍历?
回顾
单词频率计数器综合运用了流、字符串、关联容器和算法。需要排序输出时选择 map,追求速度时选择 unordered_map。请进行规范化、去除标点符号,并考虑使用停用词来获得更清晰的结果。
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「单词频率统计器」课时是免费的吗?
是的 — 「单词频率统计器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「单词频率统计器」这节课中我会学到什么?
使用 std::map 统计文本文件中每个单词出现的次数 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「单词频率统计器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。