计算每个不同单词在输入中出现的次数

时间:2010-09-29 10:55:13

标签: c++ input vector

我正在使用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

我不想使用地图,因为我还没有学到这一点。

导致此意外行为的原因是什么,以及如何解决?

2 个答案:

答案 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_inputword_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))。