"Xernoth" <JonH.Perry@googlemail.comwrote in message
news:1177025527.840281.224660@e65g2000hsc.googlegr oups.com...
Quote:
Hi,
>
I have an exercise that requests the following:
>
Write a function that reads words from an input stream and stores them
in a vector.
Use that function both to write programs that count the number of
words in the input,
and to count how many times each word occurred.
>
The below code works fine, but would like some advice on the
occurrence count.
>
I have commented out the part that concerns me.
>
#include <iostream>
#include <vector>
#include <string>
>
using std::cin;
using std::cout;
using std::endl;
using std::istream;
using std::string;
using std::vector;
>
istream& read(istream& in, vector<string>& words)
{
if (in)
{
words.clear();
string temp;
while (in >temp)
words.push_back(temp);
>
in.clear();
}
return in;
}
>
int main()
{
cout << "Enter a list of words:" << endl;
>
vector<stringwords;
read(cin, words);
>
vector<string>::size_type vecSize = words.size();
>
cout << "You entered " << vecSize << " words." << endl;
>
for (vector<string>::size_type i = 0; i < vecSize; i++)
{
int wordCount = 0;
for (vector<string>::size_type j = 0; j < vecSize; j++)
{
if (words[i] == words[j])
{
wordCount += 1;
//if (wordCount 1)
//{
// words.erase(words.begin() + j);
// vecSize = words.size();
//}
}
}
cout << "The word: " << words[i] << " occured " << wordCount
<< " times." << endl;
}
>
return 0;
}
>
With that portion of code commented, let's say I have an input with
the words:
>
"This that then that"
>
My output will appear as:
>
You entered 4 words.
The word: this occured 1 times.
The word: that occured 2 times.
The word: then occured 1 times.
The word: that occured 2 times.
>
With the code uncommented, the output appears as:
You entered 4 words.
The word: this occured 1 times.
The word: that occured 2 times.
The word: then occured 1 times.
>
Which is what I am after, but is commented code a poor method to
achieve this effect?
>
I have done a search and made a note of some responses using a
container of <string, int>, but the book I am following has not
covered this aspect.
Also I am aware of the use of size_t over ::size_type, but the book
has it's own method and am using that for the time being. It has also
not covered the use of ::iterator just yet.
>
Any advice is appreciated.
Well, you didn't specify what tools you were allowed to use. If you are
allowed to use std::map it becomes extremely easy. Consider.
std::map<std::string, intWordCount;
// for loop
WordCount[words[i]]++;
This one line of code does a whole bunch of things. You can add an entry to
a map by specifing a key that doesn't already exist in []. Then it would
increment it. A map has it's data part (.second) default constructued, for
an int it means it would be 0.
So... if WordCount[words[i]] doesn't exist, it adds it to the map, makes the
int 0, then increments it becuase of the ++ post increment.
If it already exists, it simply increments it.
When you are done iteratring through your words, you have a map keyed by the
word where the value is the number of times it appeared.
Iterate through the map when you are done to dispaly the values.