【发布时间】:2018-10-19 12:17:34
【问题描述】:
我必须阅读两个文本文件,然后将第二个文件中的单词与第一个文件进行比较。然后,我必须显示KnownWords,它们是两个文件中相同的单词,其余不同的单词是UnknownWords。下一步是,我必须在DisplayMostFreqKnownWords() 中显示最常见的已知词,在DisplayMostFreqUnknownWords() 函数中显示未知词。我已经成功完成DisplayMostFreqKnownWords(),到目前为止输出还不错。我将相同的代码从DisplayMostFreqKnownWords() 复制到DisplayMostFreqUnknownWords(),但在这个函数中它没有在输出中显示任何内容。我不知道出了什么问题。有人能解决这个问题吗?
输出是:
Displaying most frequent known words
Word Count
the 19
a 14
of 11
artificial 11
that 10
to 7
signal 7
and 7
in 6
they 5
Displaying most frequent unknown words
Word Count
头文件:
typedef map<string, vector<int> > WordMap;
typedef WordMap::iterator WordMapIter;
class WordStats
{
public:
WordStats();
void ReadDictionary();
void DisplayDictionary();
void ReadTxtFile();
void DisplayKnownWordStats();
void DisplayUnknownWordStats();
void DisplayMostFreqKnownWords();
void DisplayMostFreqUnknownWords();
private:
WordMap KnownWords;
WordMap UnknownWords;
WordMapIter Paragraph;
set<string> Dictionary;
char Filename[256];
}
我的程序:
// Displays 10 most frequent words in KnownWords
void WordStats::DisplayMostFreqKnownWords(){
int count;
multimap<int,string > displayFreqWords;// new map with int as key
(multimap because key could occur more than once)
multimap<int,string >::reverse_iterator rit = displayFreqWords.rbegin();
for (Paragraph = KnownWords.begin(); Paragraph != KnownWords.end();
++Paragraph){ // iterate map again
string word = (*Paragraph).first;
int cnt = (*Paragraph).second.size();
displayFreqWords.insert(pair<int,string>(cnt,word));
}
// multimap<int,string>::iterator rit; // iterator for new map
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;
}
}
// Displays 10 most frequent words in UnknownWords
void WordStats::DisplayMostFreqUnknownWords(){
int count;
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));
}
// multimap<int,string>::iterator rit; // iterator for new map
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;
}
}
【问题讨论】:
-
不清楚你在问什么。请edit您的帖子澄清并提供minimal reproducible example。
-
代码使用
for(; count<=10作为循环条件,但从不使用count = 0;设置起始值。 -
1) 你从不初始化
count2) 你应该检查UnknownWords的内容,看看你是否真的在displayFreqUnknownWords中放入了元素 -
如果这些是错误,那么为什么 DisplayFreqKnownWords() 工作得非常好,而两者的编码几乎相似。另外,如何检查 UnknownWords 以了解我是否真的将元素放在 displayFreqUnknownWords 中。
标签: c++ vector stl multimap reverse-iterator