## FotG2

I have this section of code that keeps giving a vector subscript out of range error, but I cant figure out why.

the vector is defined as

``vector< vector<double> > distance;``

for the test I am doing, point->size() = 3, and through the debugger I have verified that the matrix does get resized to 3 by 3, however when it gets to [2][2] it throws the vector subscript out of range error. How do I fix this?

``````//resize matrix
distance.resize(point->size());
for (int i = 0; i < point->size(); i++)
distance[i].resize(point->size());

for (int i = 0; i < point->size(); i++)
{
for (int j = 0; j	< point->size(); j++)
{
cout << i << ", " << j << endl;
distance[i][j] = *removed*;
}
}``````

## daviddoria 334

Can you post a compilable example of your problem?

## NathanOliver 429

How big is the vector inside the vector? The main vector is of size 3 so the subscript [2] should be fine but I don't see anything for the size of each vector in distance. what would happen if you accesses distance[1][2]. Does that throw an exception?

## FotG2

No, [1][2] does not throw an exception, [2][2] is the only one, and Ive also tried making the vectors bigger than they need to be as well as statically making it 10 by 10, with the same error at [2][2]

I'm kinda thinking this is a bug in with microsofts vector.h in visual studio 2010

## FotG2

``````#include <iostream>
#include <math.h>
#include <vector>
#include <utility>

using namespace std;

class tsp1
{
private:
double totalDistance;
vector<pair<double,double>> *point; //points = x,y respectivly
vector< vector<double> > distance;
void distantiate()
{
//resize the matrix
distance.resize(point->size());
for (int i = 0; i < point->size(); i++)
distance[i].resize(point->size());

for (int i = 0; i < point->size(); i++)
{
for (int j = 0; j	< point->size(); j++)		//make a matrix of all the distances from point to point
{	// sqrt |Pythagorean theorm|
cout << i << ", " << j << endl;
distance[i][j] = sqrt(
fabs(
pow( ((point->at(j).first) - (point->at(i).first)),2) +
pow( ((point->at(j).second) - (point->at(i).second)),2)));
}
}
}

{
point->push_back(pair<double,double>(x,y));
}

};``````

That is all the code that deals with the matrix right now

## daviddoria 334

Can you post a compilable example of your problem?

## FotG2

that code above is compilable

## daviddoria 334

First, you need to put a space between the two angle brackets:

``vector<pair<double,double> > *point; //points = x,y respectivly``

``vector<pair<double,double>> *point; //points = x,y respectivly``

It should not only compile (which it doesn't):

``(.text+0x18): undefined reference to `main'``

but also have a simple use case - an example where we can compile, run, and see the error.

commented: Formating of a program is the programmers choice and when is related to a single space should not be remarked on +0

## FotG2

1. compilers ignore white space
2. Writing a simple main that implements that takes less than a minute so I figured thats not a big deal

``````#include <iostream>
#include <math.h>
#include <vector>
#include <utility>

using namespace std;

class tsp1
{
public:
double totalDistance;
vector<pair<double,double>> *point; //points = x,y respectivly
vector<<vector<double>> distance;
vector<int> order;
//long TWO;

void distantiate()
{
//resize the matrix
distance.resize(point->size());
for (int i = 0; i < point->size(); i++)
distance[i].resize(point->size());

for (int i = 0; i < point->size(); i++)
{
for (int j = 0; j	< point->size(); j++)		//make a matrix of all the distances from point to point
{	// sqrt |Pythagorean theorm|
cout << i << ", " << j << endl;
distance[i][j] = sqrt(
fabs(
pow( ((point->at(j).first) - (point->at(i).first)),2) +
pow( ((point->at(j).second) - (point->at(i).second)),2)));
}
}
}

tsp1() : totalDistance(0)
{
point = new vector<pair<double,double>>;
}

{
point->push_back(pair<double,double>(x,y));
}
};

int main()
{
tsp1 tsp;

tsp.distantiate();

return 0;
}``````

## FotG2

I solved my issue by not using vectors and instead defining distance as

``double **distance;``

## daviddoria 334

You're right, compilers do ignore white space, but they do not ignore symbols - I think it interprets >> as the instream operator.

``vector<pair<double,double>> *point; //points = x,y respectivly``

produces

``error: '>>' should be '> >' within a nested template argument list``

on g++4.4.1.

Just because it works on your compiler doesn't mean it is right.

Dave

commented: Some rep back http://www.comeaucomputing.com/techtalk/templates/#shiftshift +4