Vector Issues - What am i doing wrong?

Started by
10 comments, last by neilski_2003 17 years, 6 months ago
Hi there everyone, I have been doing an exercise from a textbook and have come a cropper and no matter what i have tried i can't get it to work. Anyway what i am trying to do is read a load of input into a vector, and then find out how many distinct words are in there by comparing the contents of each. Anyhow at the moment when i try and output the contents of my vector it seems to be missing the first and last elements i typed. Anyone know why. Heres my code below.
[source lang  = "cpp"]

//write a program to count how many times each distinct word appears in its input

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <string>
#include <vector>

using namespace std;

int main()
{
	cout<<"Please Enter the Text You Wish to be analysed one word at a time :"<<endl;
	string text;
	cin>>text;

	//put the text in a vector
	vector<string> words;
	string x;

	while (cin>>x)
	{
		words.push_back(x);
	}

	typedef vector<string>::size_type vec_sz;
	vec_sz size = words.size();
	
	//check that a word was entered if not wuit the program
	if (size==0)
	{
		cout<<endl<<"You Must Enter atleast one word."<<endl;
		return 1;
	}

//	sort (words.begin(), words.end());
	int counter;
	counter = 0;

	// create a loop to go through each item in the vector
	for (vec_sz i = 0; i<(size-1); ++i)
	{
		//compare the current index with the next - if they are not the same add to counter
		if (words != words[i+1])
		{
			++counter;
		}
		cout<<words<<endl;
	}

	//test the last item against all others to make sure its unique
//	if (words[size-1] != words[size-2])
//	{
//		++counter;
//		cout<<words[size-1]<<endl;
//	}
	
//	cout<<counter<<endl;
	cout<<words[0]<<endl;
	system("PAUSE");
	return 0;
}


for example if i entered: fat bob is very fat the output i get is bob is very Could anyone shed light on what i am doing wrong and point me in the direction of a solution that would be great. Cheers all. I shall continue to wrack my brain and see if i beat any of you smart lot to a solution. Ta Neil
Advertisement
not sure why it's missing the first, but here's why it's missing the last:

for (vec_sz i = 0; i<(size-1); ++i)

assume the size is 5 (i.e. 5 words in the vector).

for( i = 0; i < (5-1); ++i )

you will print the following:

0
1
2
3
-> you won't print 4 because 4 is not < 5-1

the for loop should look like:
for (vec_sz i = 0; i<size; ++i)

actually, though, for iterating vectors it's cleaner to do the following because it will allow you to easily switch over to list or whatever later on if you need to:

vector<string>::iterator ite = words.end();for ( vector<string>::iterator it = words.begin(); it != ite; ++it ){    // *it is the item in the list}


[WARNING: my fix will break the if statement inside your loop. you need to fix that so it doesn't compare against the next word if it's the last word in the list]

-me

p.s. wth does "come a cropper" mean? =)
Thanks for that,

I shall try and fix the inner loop now and see what happens.

Come a cropper probably wasn't the right phrase but it basically means that i've tried to do something that i couldn't and been caught out.
the first isn't being read.

You have cin>>text

then the loop goes

cin>>x

before text is stored.
Bounding issues are easy to make, but when using iterators frequently can avoid them.

If you want to still use indexes you can use:

[source lang = "cpp"]	int counter;	counter = 0;	// create a loop to go through each item in the vector	for (vec_sz i = 0; i < size; ++i)	{		//compare the current index with the next - if they are not the same add to counter		if (i+1 < size && words != words[i+1])		{			++counter;		}		cout<<words<<endl;	}
Thanks for that, I'm at chapter 3 in this book as you could probabaly tell from the schoolboy nature of my error.

Still can't figure out what i am doing wrong with regards to the first element dissapearing but what can you do?
I missed your first post about the cin bit, but having reviewed it and had a look i have managed to remedy my error.

Thanks to you two my program actaully does what its supposed to do.

Cheers

The new code is here

[source lang = "cpp"]//write a program to count how many times each distinct word appears in its input#include <iostream>#include <algorithm>#include <iomanip>#include <string>#include <vector>using namespace std;int main(){	cout<<"Please Enter the Text You Wish to be analysed one word at a time :"<<endl;	vector<string> words;	string text;		while (cin>>text)	{		words.push_back(text);	}	typedef vector<string>::size_type vec_sz;	vec_sz size = words.size();		//check that a word was entered if not wuit the program	if (size==0)	{		cout<<endl<<"You Must Enter atleast one word."<<endl;		return 1;	}	sort (words.begin(), words.end());	int counter;	counter = 0;	// create a loop to go through each item in the vector	for (vec_sz i = 0; i<size; i++)	{		//compare the current index with the next - if they are not the same add to counter		cout<<i<<endl;		//if your not at the last item and the words are different add to the counter		if (i+1 < size && words != words[i+1])		{			++counter;		}		cout<<words<<endl;	}	if (words[size -1] != words[size-2])	{		++counter;	}	cout<<"There are "<<counter<<" different words in that text"<<endl;	system("PAUSE");	return 0;}
Out of uttery curiosity is this an exercise from the book C++ Primer by Stanley Lippman?
Quote:Original post by neilski_2003
Thanks for that, I'm at chapter 3 in this book as you could probabaly tell from the schoolboy nature of my error.

Still can't figure out what i am doing wrong with regards to the first element dissapearing but what can you do?


As an above poster pointed out, you're throwing away the first entry:

cout<<"Please Enter the Text You Wish to be analysed one word at a time :"<<endl;string text;cin>>text;


the first word is stored in the text variable, but then you call cin>>x which gets the next word and you store the next one. the word stored in text is never put into your vector. that variable just plain ol shouldn't exist.

Incedentally, this is where using a debugger would come in handy. by stepping through the program you could see exactly what's getting stored where and why.

-me
Saruman,

Nope its from "Accelerated C++" but i'd imagine a liot of the books have similar exercises as they should all cover much the same stuff.

To be precise its exercise 3-3.

Cheers
Neil

This topic is closed to new replies.

Advertisement