Abdalah El-Barrad - 1 year ago 105
C++ Question

# Vector size not increasing as variable is added

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)
``````

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download