Abdalah El-Barrad - 4 months ago 8

C++ Question

I have the following script that creates all possible points in a specific base:

`int main(){`

int base;

cout << "Enter Base: ";

cin >> base;

int dimension;

cout << "Enter Dimension: ";

cin >> dimension;

//This creates all possible numbers

vector<double> dist;

dist.reserve(base);

for(int k=0; k<base; k++){

dist[k] = (-1.0+k*2.0/(base-1.0));

}

vector< vector<double> > points;

int perms = 1;

for(int i=0; i<dimension; i++){

perms *= base;

} // base^dimension

points.reserve(perms);

vector<double> stand;

stand.reserve(dimension);

// Defined later

getPermutations(dist, base, stand, dimension, 0, points);

for(int i=0; i<points.size(); i++){ //DOESN'T DO ANYTHING BECAUSE SIZE IS 0

cout << '(';

for(int j=0; j<points[i].size(); j++){

cout << points[i][j] << ',';

}

cout << ')' << endl;

}

return 0;

}

It won't do anything because the size function only increases when I use the push_back() function instead of indexing. I have to use indexing because of the permutations function below:

`void getPermutations(vector<double>& arr, int size,`

vector<double>& data,int dimension,

int index, vector< vector<double> >& combs){

int i;

//stop recursion condition

if(index == dimension){

combs.push_back(data);

}

else{

for(i = 0; i < size; i++){

data.at(index) = arr.at(i);

getPermutations(arr, size,data,

dimension,index+1, combs);

}

}

}

I don't understand why the vector sizes are zero and errors keep popping up saying:

`terminate called after throwing an instance of 'std::out_of_range'`

what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)

Answer

The `std::vector::reserve`

function doesn't do what you think it does. It doesn't change the size, just the capacity (the amount of memory allocated for the vector).

That means when you create e.g. the `dist`

vector and directly after calling `reserve`

you have a loop and do

```
dist[k] = (-1.0+k*2.0/(base-1.0));
```

you are actually indexing out of bounds and have undefined behavior.

The solution is to actually set the *size*. Either through `std::vector::resize`

, or simply setting the size when creating the vector:

```
std::vector<double> dist(base); // Creates vector with a specific size
```

You have the same problem with all your vectors, and all of them needs to change accordingly.