ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-24 18:08:47  阅读:216  来源: 互联网

标签:c vector stdvector size


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

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矢量和调用后直接保留你有一个循环和做

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

你实际上索引越界并且有未定义的行为.

解决方案是实际设置大小.要么通过std::vector::resize,要么只是在创建向量时设置大小:

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

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

标签:c,vector,stdvector,size
来源: https://codeday.me/bug/20190724/1524704.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有