473,387 Members | 1,575 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Function to output words in a vector and the occurrence.

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.

Apr 19 '07 #1
6 3917
"Xernoth" <Jo********@googlemail.comwrote in message
news:11**********************@e65g2000hsc.googlegr oups.com...
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.
Apr 19 '07 #2
On Apr 20, 12:53 am, "Jim Langston" <tazmas...@rocketmail.comwrote:
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]]++;
Yes, this is what I read on another post as a solution, however the
book has not yet covered ::map. For the record, it's the Accelerated C+
+ book. Chapter 4, exercise 4-5.

Apr 20 '07 #3
On 20 Apr, 01:32, Xernoth <JonH.Pe...@googlemail.comwrote:
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'm not sure how much better it it but it would reduce the code to a
single loop if you first sorted the vector (using std::sort()) and
then went through the vector and took notice of when the word changed,
something like this (totally untested):

cout << "You entered " << vecSize << " words." << endl;

sort(words.begin(), words.end())

string currentWord = words[0];
int wordCount = 0;
for (vector<string>::size_type i = 0; i < vecSize; i++)
{
if (words[i] == currentWord)
++wordCount;
else
{
cout << "The word: " << currentWord << " occured " << wordCount <<
" times\n";
wordCount = 1;
currentWord = words[i];
}
}

--
Erik Wikström

Apr 20 '07 #4
I'm not sure how much better it it but it would reduce the code to a
single loop if you first sorted the vector (using std::sort()) and
then went through the vector and took notice of when the word changed,
something like this (totally untested):
You are not the only one who thought that :)) when I was reading that
book I tried out sth like this:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
int main(){

std::string x;
std::vector<std::stringinput;
std::vector<std::stringsorted_input;
std::vector<std::stringwords;
std::vector<intcounts;
std::vector<std::string>::size_type vec_sz;
int count=1;
while(std::cin >x)
input.push_back(x);

sort(input.begin(),input.end());

std::string test=input[0];

vec_sz=input.size();

for(unsigned i=0;i!=vec_sz;++i)
std::cout << input[i] << std::endl;
for(unsigned k=1;k!=vec_sz;++k){

if(input[k]==test){
++count;
if(k==vec_sz-1){
words.push_back(test);
counts.push_back(count);
}
}
else{
words.push_back(test);
counts.push_back(count);
test=input[k];
count=1;
if(k==vec_sz-1){
words.push_back(test);
counts.push_back(count);
}
}
}
vec_sz=words.size();
std::cout << "WORDS" <<"\t"<<"OCCURENCE#"<<std::endl;
for(unsigned i=0;i!=vec_sz;++i)
std::cout << words[i]<<"\t" << counts[i]<< std::endl;

return 0;

}
Hope it helps, feel free to experiment on the code... not the elegant
way to accomplish the task but a humble different approach.

Greetings,

Apr 20 '07 #5
On Apr 20, 7:18 am, Erik Wikström <eri...@student.chalmers.sewrote:
I'm not sure how much better it it but it would reduce the code to a
single loop if you first sorted the vector (using std::sort()) and
then went through the vector and took notice of when the word changed,
something like this (totally untested):
utab wrote:
You are not the only one who thought that :)) when I was reading that
book I tried out sth like this:
Thanks to both of you. That seems like a good approach, and more to
what the book is looking for, since it does not cover the use of any
extra functions for vectors.
I'll give that a try, but looking over the code, will seem to do just
what I'm after.

Apr 20 '07 #6
In article <11**********************@b58g2000hsg.googlegroups .com>,
er****@student.chalmers.se says...

[ ... ]
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'd do this a bit differently, something like this:

// Warning: this code has received only minimal testing.
//
typedef std::pair<std::string, intword_count;

namespace std {
// I believe putting this in ::std is officially cheating, but...
std::ostream &operator<<(std::ostream &os, word_count const &p) {
os << "The word: " << p.first
<< " occurred " << p.second << " times.";
return os;
}
}

void count(std::istream &in, std::ostream &out) {
std::map<std::string, intword_counts;

std::string temp;

while (in >temp)
++word_counts[temp];

std::copy(word_counts.begin(), word_counts.end(),
std::ostream_iterator<word_count>(out, "\n"));
}

Another possibility would be to collect the words in a multiset, and
then use std::equal_range and std::distance to produce the output.

--
Later,
Jerry.

The universe is a figment of its own imagination.
Apr 21 '07 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: Thomas Köllmann | last post by:
Hi, everybody! I'm teaching myself Python, and I have no experience in programming apart from some years of shell scripting. So, please bear with me. These two funktions are part of an...
10
by: Huibuh | last post by:
The following code is a function called from the main. Sence is to initialize a vector of the dimension of "a". "b" is the according value (all the same in a vector). The problem is that the...
6
by: Mike Darrett | last post by:
Hello, First off, I'm a C++ newbie, so please turn your flame guns off. ;) I'm wondering if this is the correct way to have a function return a vector: vector<int> GetVecData() {...
6
by: utab | last post by:
Dear all, I am trying to count the occurence of words in an input stream I can keep my words in a vector<string> as below; #include <iostream> #include <cmath> #include <vector> #include...
3
by: utab | last post by:
Dear, The thing I would like to do is to write a function(count) that counts the occurence of words in my input. If the vector is like "st1" "st1" "st2" "st2" "st2"
7
by: abraxas | last post by:
Ok maybe someone here can help me. I have been learning c++ and have been toying with some basic programming and have run into something that I would have assumed would have been fairly easy. I...
10
by: Johny | last post by:
I need to find all the same words in a text . What would be the best idea to do that? I used string.find but it does not work properly for the words. Let suppose I want to find a number 324 in...
11
by: Daniel T. | last post by:
The function below does exactly what I want it to (there is a main to test it as well.) However, I'm curious about ideas of making it better. Anyone interested in critiquing it? void formatText(...
8
TimNick90
by: TimNick90 | last post by:
I am making a hangman program for school that uses a function for the player to input their guess and a seperate function to test whether or not their guessed letter is in the word. The program...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.