C++ Academy · 课时

单词频率统计器

使用 std::map 统计文本文件中每个单词出现的次数

第 4 / 4 课14 个步骤

单词频率统计器 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 构建一个简单的命令行计算器
  2. 读取和写入 CSV 文件
  3. 数字猜谜游戏
  4. 单词频率统计器
← 返回 C++ Academy