Подсчитайте, сколько раз каждое отдельное слово появляется на входе - PullRequest
2 голосов
/ 29 сентября 2010

Я работаю над упражнением из 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 ]

3 голосов
/ 29 сентября 2010

Предполагая, что std :: vector является единственным контейнером, с которым вы знакомы на данный момент, и что вы еще не получили std :: pair, я предлагаю следующее:

  • вы добавляете std::vector<int> word_count
  • в цикл std::cin, вы проверяете, присутствует ли текущее слово в word_input.Если это не так, вы push_back слово и push_back 1 в word_count.Если для текущего слова уже есть запись с некоторым индексом i в word_input, вы увеличиваете word_count с этим индексом i.Таким образом, каждое отдельное слово, которое вы вводите, появляется только один раз в word_input, с количеством раз, когда оно было введено, управляется в word_count.
  • для вывода, шаг через word_input иword_count параллельно и выведите количество слов для каждого слова.

Готово.

Но все это становится намного проще и элегантнее с std::map.Продолжай читать!: -)

1 голос
/ 29 сентября 2010

Просто удалите оператор 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)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...