如何基于给定自定义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
相关产品推荐
相关产品推荐

