Sign in to follow this  
neilski_2003

Vector Issues - What am i doing wrong?

Recommended Posts

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[i] != words[i+1])
		{
			++counter;
		}
		cout<<words[i]<<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

Share this post


Link to post
Share on other sites
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? =)

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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[i] != words[i+1])
{
++counter;
}
cout<<words[i]<<endl;
}

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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[i] != words[i+1])
{
++counter;
}
cout<<words[i]<<endl;
}

if (words[size -1] != words[size-2])
{
++counter;
}

cout<<"There are "<<counter<<" different words in that text"<<endl;
system("PAUSE");
return 0;
}


Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Quote:
Original post by neilski_2003
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.

Aha! The only reason I ask is because most books on C++ are utterly horrible and don't use the standards like vectors, etc. Accerated C++ is one of the few books (along with C++ Primer) that is used for teaching and actually does it properly :)

Share this post


Link to post
Share on other sites
Yeah someone said that too me on here and recommended it because it would actually be useful.

I did some c++ at uni but it was very much the 'learn whats needed to pass the unit' type of learning so i needed something to fill in the rest so i actually know what i am doing.

I've found the exercises brilliant to be honest. Challenging but not impossible, and they also make you use the things they have introduced in the chapter to the extent that they become 'almost' second nature.

Muchos Kudos to the person(s) who recommended it to me. Whomever they may be!

Cheers
Neil

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this