0

So I always seem to encounter this error. I usually find some odd hackish fix for it but this time I'm having too much trouble. I'm basically trying to make a program which corrects words the user types in (similar to that of any modern phone). The function I'm posting below is an attempt to make a vector of vectors. I am associating every letter with it's neighbor keys. For example...

If the user types in the letter 'A', I want a vector with the value 'A' to hold every letter that the 'A' key touches (Q, W, S, and Z). Every time I compile I get a subscript error. Any help would be appreciated.

vector< vector<string> > letterNeighbors; // VECTOR OF VECTORS

ifstream fin("iPhone_keyboard.txt"); // IPHONE KEYBOARD LIST
while ( fin ) // WHILE THE CONSOLE CAN TAKE INPUT
{
				
	char templateLetter; // FIRST LETTER
	string neighborLetter; // NEIGHBORING LETTERS

	fin >> templateLetter; // GETS THE FIRST CHARACTER OF THE LINE (TEMPLATE)
	getline(fin, neighborLetter); // GETS THE STRING OF CHARACTERS NEXT TO IT (NEIGHBORS)

	int neighborSize = neighborLetter.size(); // USED TO REFERENCE NUMBER OF ITERATIONS FOR LOOP
	int i = 0;

	while ( i < neighborSize )
	{
	letterNeighbors.resize( 123, vector<string> (neighborSize) ); // RESIZES VECTOR
	letterNeighbors[templateLetter][i] = neighborLetter.substr(i);	// MAKES A VECTOR WITH THE TEMPLATE LETTER AND GRADUALLY ADDS NEIGHBORS
	i++;
	}

}
3
Contributors
9
Replies
10
Views
6 Years
Discussion Span
Last Post by arkoenig
0

What's the error? Compile time or run time? If run time, have you tried putting in code to determine just which statement is causing the trouble?

0

Sorry, the error is in run time. I have tried resizing the vector multiple times. I get an error when the program tries to assign values...

letterNeighbors[templateLetter][i] = neighborLetter.substr(i);	// MAKES A VECTOR WITH THE TEMPLATE LETTER AND GRADUALLY ADDS NEIGHBORS

I only assign the number of values because of the error. The run time error persists even when the line where I resize the vector is removed.

0

Ok, so I have been messing around with the size of the vector and I decided to change the resize...

letterNeighbors.resize( 123, vector<string> (neighborSize) );

to

letterNeighbors.resize( 600, vector<string> (600) );

It works when I make the vector that large but it takes a longer time to run through the program. Any idea why it needs to be such a high number / how I can make it lower?

0

I knew that the default vector size was 0, I just thought that one of the reasons to use vectors was that they could resize themselves based on input. Even if a vector starts with a size of 0, when I add values it should automatically change it's size. Is that not correct? I would assume I could only get a "Subscript out of range" error if I specified the vector size and then tried to assign values outside of that range.

0

If v is a vector, v has undefined behavior if i is out of range (i.e. if i >= v.size()). Accessing v does not create that element (or any element) if that element does not already exist.

If you want to append a new element x to v, you can execute v.push_back(x), which will increase the size of v by one, and put a copy of x into the newly created element.

0

I guess I could solve the problem by including a push_back statement in the loop which would automatically add one value to the vector and then have it replaced immediately afterwards. Either way I am sticking with a resize I have found that works. It isn't the most efficient way but it works. Thanks.

0

I do not understand what you expect these two statements to accomplish:

letterNeighbors.resize( 123, vector<string> (neighborSize) );
letterNeighbors[templateLetter][i] = neighborLetter.substr(i);

After you have executed the first of these statements, letterNeighbors will have exactly 123 elements, each of which will be a vector. So when you execute the second statement, if the value of templateLetter is >= 123, the result will be a subscript out of range.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.