我正在使用Accelerated C ++进行练习:
编写一个程序来计算每个不同单词在其输入中出现的次数。
这是我的代码:
#include <iostream>
#include <string>
#include <vector>
int main()
{
// Ask for
// and read the input words
std::cout << "Please input your words: " << std::endl;
std::vector<std::string> word_input;
std::string word;
int count = 0;
while (std::cin >> word)
{
word_input.push_back(word);
++count;
}
// Compare the input words
// and output the times of every word compared only with all the words
/***** I think this loop is causing the problem ******/
for (int i = 0; i != count; ++i)
{
int time = 0;
for (int j = 0; j != count; ++j)
{
if (word_input[i] == word_input[j])
++time;
else
break;
}
std::cout << "The time of "
<< word_input[i]
<< " is: "
<< time
<< std::endl;
}
return 0;
}
如果您编译并运行此程序,您将看到:
Please input your words:
我输入如下:
good good is good EOF
然后显示:
The time of good is: 2 The time of good is: 2 The time of is is: 0 The time of good is: 2
我的预期结果是:
The time of good is: 3 The time of is is: 1
我不想使用地图,因为我还没有学到这一点。
导致此意外行为的原因是什么,以及如何解决?
答案 0 :(得分:3)
假设std :: vector是你在这一点上熟悉的唯一容器,并且你还没有得到std :: pair,我建议如下:
std::vector<int> word_count
std::cin
while循环中word_input
中是否存在当前单词。如果不是,则push_back
push_back
word_count
{1}}中的{1}}。如果i
中某个索引word_input
上的当前单词已有条目,则会在此索引word_count
处递增i
。因此,您输入的每个不同字词仅在word_input
中显示为一次,其中输入的次数在word_count
中进行管理。word_input
和word_count
并输出每个单词的字数。完成。
但是std::map
所有这些都变得更加简单和优雅。继续阅读! : - )
答案 1 :(得分:1)
只需删除else语句。
int main()
{
// Ask for
// and read the input words
std::cout << "Please input your words: "
<< std::endl;
std::vector<std::string> word_input;
std::string word;
int count = 0;
while (std::cin >> word)
{
word_input.push_back(word);
++count;
}
// Compare the input words
// and output the times of every word compared only with all the words
for (int i = 0; i != count; ++i)
{
int time = 0;
for (int j = 0; j != count; ++j)
{
if (word_input[i] == word_input[j])
++time;
// else <========== You don't need this!
// break;
}
std::cout << "The time of "
<< word_input[i]
<< " is: "
<< time
<< std::endl;
}
return 0;
}
请注意,对于较大的输入,您的解决方案非常慢。更好的想法是使用哈希表(std :: map)作为你的'字典'或者对该向量进行排序,然后计算不同的单词(在O(logN * N)中运行,你的解决方案是O(N ^ 2))。