You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于给定自定义List类用C++统计列表中各单词的出现频率

适配固定List实现的单词频率统计方案

因为你使用的这套List仅提供了顺序遍历接口、没有随机访问/元素查找能力,且必须严格遵循固定的调用规则,完全不需要修改List源码,仅通过外部辅助结构就能实现频率统计。

核心实现逻辑

  • 严格按照List规定的遍历流程访问所有元素:必须先调用first()获取首元素,再循环调用next()按顺序遍历后续元素,避免触发List内置的调用错误。
  • 用额外的容器存储「单词-出现次数」的映射关系,不依赖List本身的查找功能。

具体实现代码

这里提供两种适配方案,都不需要改动原有List的实现:

方案1:无外部库依赖的纯数组实现(适配List最大50元素的容量)

因为List最大容量仅为50,完全可以用固定长度数组做计数存储,没有额外依赖:

// 辅助计数结构,大小和List最大容量对齐
string freqWords[maxListSize];
int freqCounts[maxListSize] = {0};
int uniqueWordCount = 0;
string currentWord;

// 按List规则启动遍历
if (names.first(currentWord)) {
    do {
        // 检查当前单词是否已经在不重复列表中
        bool found = false;
        for (int i = 0; i < uniqueWordCount; i++) {
            if (freqWords[i] == currentWord) {
                freqCounts[i]++;
                found = true;
                break;
            }
        }
        // 新单词则新增一条计数记录
        if (!found) {
            freqWords[uniqueWordCount] = currentWord;
            freqCounts[uniqueWordCount] = 1;
            uniqueWordCount++;
        }
    } while (names.next(currentWord));
}

// 输出统计结果
cout << "单词出现频率:" << endl;
for (int i = 0; i < uniqueWordCount; i++) {
    cout << freqWords[i] << " : " << freqCounts[i] << "次" << endl;
}

方案2:用标准库映射容器简化逻辑

如果项目允许使用C++标准库的unordered_map,代码会更简洁,不需要手动维护查找逻辑:

#include <unordered_map>
unordered_map<string, int> freqMap;
string currentWord;

// 同样遵循List的遍历规则
if (names.first(currentWord)) {
    do {
        freqMap[currentWord]++;
    } while (names.next(currentWord));
}

// 输出统计结果
cout << "单词出现频率:" << endl;
for (auto &[word, count] : freqMap) {
    cout << word << " : " << count << "次" << endl;
}

注意事项

  • 绝对不能跳过first()直接调用next(),否则会触发List的内置错误提示,导致遍历中断。
  • 因为List容量上限为50,所有计数结构的容量都完全覆盖实际可能的元素规模,不会出现越界问题。
  • 整个过程没有修改原有List类的任何代码,完全满足固定实现的要求。

内容的提问来源于stack exchange,提问作者Mostafa Hendawi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 12:54:10