矢量大小不会随着变量的添加而增加

Vector size not increasing as variable is added

我有以下脚本可以在特定基础上创建所有可能的点:

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;
}

它不会做任何事情,因为只有当我使用 push_back() 函数而不是索引时,size 函数才会增加。由于下面的排列函数,我必须使用索引:

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);
    }
  }
}

我不明白为什么矢量大小为零并且不断弹出错误说:

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)

std::vector::reserve 函数并不像您想象的那样。它不会改变大小,只会改变容量(为向量分配的内存量)。

这意味着当您创建例如dist 向量并在调用 reserve 之后直接执行循环并执行

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

实际上您的索引超出了范围并且有未定义的行为。

解决方案是实际设置大小。通过 std::vector::resize,或者在创建向量时简单地设置大小:

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

你所有的向量都有同样的问题,所有的向量都需要相应地改变。