STL reverse_iterator问题:DisplayMostFreqUnknownWords函数无输出排查
嘿,我帮你排查出问题啦!你的DisplayMostFreqUnknownWords()没输出,主要是两个关键点,咱们一步步说:
1. 最直接的原因:未初始化的count变量
你看两个函数里的int count;都没初始化!在C++里,局部变量如果不手动初始化,会是随机的垃圾值:
- 碰巧在
DisplayMostFreqKnownWords()里,这个垃圾值是0,所以循环条件count<=10一开始就成立,能正常输出; - 但在
DisplayMostFreqUnknownWords()里,这个垃圾值大概率是个大于10的数,直接导致循环跳过,啥都不输出。
修复方法:把两个函数里的int count;改成int count = 0;就行!
2. 额外检查:确认UnknownWords是否真的有数据
如果修复了count还是没输出,那得先确认UnknownWords容器里有没有内容。你可以在DisplayMostFreqUnknownWords()开头加一行调试代码:
cout << "UnknownWords 总数量:" << UnknownWords.size() << endl;
如果输出是0,说明你的ReadTxtFile()函数没正确把未知单词存进UnknownWords里,这时候要检查:
- 单词匹配逻辑是不是有大小写问题?比如字典里是小写,文本里是大写,导致误判成未知单词;
- 是不是把未知单词的存储逻辑写错了,比如不小心存到
KnownWords里了?
修复后的完整代码
我把两个函数的错误都修正了,加上了count的初始化:
// 展示KnownWords中频率最高的10个单词 void WordStats::DisplayMostFreqKnownWords(){ int count = 0; // 必须初始化! multimap<int,string > displayFreqWords; multimap<int,string >::reverse_iterator rit = displayFreqWords.rbegin(); for (Paragraph = KnownWords.begin(); Paragraph != KnownWords.end(); ++Paragraph){ string word = (*Paragraph).first; int cnt = (*Paragraph).second.size(); displayFreqWords.insert(pair<int,string>(cnt,word)); } cout <<" Word Count\n"; for(; count<=10 && rit!=displayFreqWords.rend(); rit++, ++count){ string word = (*rit).second; int cnt = (*rit).first; cout << setw(15) << word << setw(10) << cnt << endl; } } // 展示UnknownWords中频率最高的10个单词 void WordStats::DisplayMostFreqUnknownWords(){ int count = 0; // 必须初始化! multimap<int,string > displayFreqUnknownWords; multimap<int,string >::reverse_iterator rrit = displayFreqUnknownWords.rbegin(); for (Paragraph = UnknownWords.begin(); Paragraph != UnknownWords.end(); ++Paragraph){ string word = (*Paragraph).first; int cnt = (*Paragraph).second.size(); displayFreqUnknownWords.insert(pair<int,string>(cnt,word)); } cout <<" Word Count\n"; for(; count<=10 && rrit!=displayFreqUnknownWords.rend(); rrit++, ++count){ string wrd = (*rrit).second; int ccnt = (*rrit).first; cout << setw(15) << wrd << setw(10) << ccnt << endl; } }
小建议
你可以把这两段重复的逻辑抽成一个私有辅助函数,比如DisplayTopNWords(const WordMap& wordMap, int n),这样既避免代码重复,也能减少以后的出错概率~另外处理单词的时候统一转成小写,能避免大小写差异导致的误判哦!
内容的提问来源于stack exchange,提问作者muzzi
相关产品推荐
相关产品推荐

