0

いくつかの単語を取り込んでベクターに格納し、並べ替えてから、各単語の出現回数を数えて出力する次のコードがあります。

typedef vector<double>::size_type vec_sz;
vector<string> words;

string c;

cout << "Enter some words!" << endl << endl;
while (cin >> c) {
    words.push_back(c);
}

vec_sz size = words.size();
sort(words.begin(), words.end());

string current_word = words[0];
int count = 1;

for (int i = 1; i < size; i++) {
    if (words[i] == current_word) {
        count++;
    }
    else {
        cout << "The word " + current_word + " appears " << count << " times." << endl;
        current_word = words[i];
        count = 1;
    }
}

私はいくつかの言葉を入力します:

word
word
lol
hello
lol
word
hello
^Z

次に、次の出力を取得します。

The word hello appears 2 times.
The word lol appears 2 times.

しかし、最終的な単語セットには決して到達しません。ベクター内の各要素を出力するようにループを変更したところ、すべての要素が出力されました。しかし、何らかの理由で、このループは単語の最終セットに到達したくありません。何がうまくいかないのですか?

4

2 に答える 2

3

ここで最後の言葉に到達しています:

else {
    // Previous word printed
    cout << "The word " + current_word + " appears " << count << " times." << endl;
    // current_word set to last word
    current_word = words[i];
    count = 1;
}

そして、ループは終了します。したがって、最後の単語とそのカウントを出力するには、ループの外側に最後の行が必要になります。

于 2012-06-29T20:30:55.233 に答える
2

count メッセージは、異なる単語が見つかった場合にのみ表示されます。最後の単語が見つかった場合、別の単語に遭遇しないため、メッセージは出力されません。for最後の単語のカウントを出力するには、の後にコードが必要です。

std::map<std::string, unsigned int>たとえば、次のように使用して、これを達成する他の方法があります。

map<string, unsigned int> word_counts;
string c;

cout << "Enter some words!" << endl << endl;
while (cin >> c) {
    word_counts[c]++;
}

for (map<string, unsigned int>::iterator wci = word_counts.begin();
     wci != word_counts.end();
     wci++)
{
    cout << "The word " << wci->first << " appears " << wci->second << "times.";
}
于 2012-06-29T20:31:05.923 に答える