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

时间:2016-08-02 16:50:49

标签: c++ vector size stdvector

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

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)

1 个答案:

答案 0 :(得分:8)

std::vector::reserve功能并不能完成您的想法。它不会改变大小,只改变容量(为向量分配的内存量)。

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

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

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

解决方案是实际设置 size 。通过std::vector::resize,或者只是在创建矢量时设置大小:

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

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