为什么行“ subsets.push_back(n);”在以下代码中给我一个错误?

时间:2019-05-14 12:13:58

标签: c++

我想找到一组数字的幂集,但是我无法使用代码解决一些问题。我应该进行哪些更改?

vector<vector <int>> subsets={{}};
for(int i=0; i<a.size();i++){
    int elem = a[i];
    for(int j=0;j<subsets.size();j++){
        vector<int> prev = subsets[j];
        vector<int> n = prev;
        n.push_back(elem);
        subsets.push_back(n);
    }
}

我收到以下错误: “”在抛出'std :: bad_alloc'实例后调用终止方法“”

2 个答案:

答案 0 :(得分:4)

comment中所述:

  

[您的代码包含一个] 无限循环。你在打电话   subsets.push_back在循环内,因此subsets.size在以下位置增加   循环的每次迭代都无法停止,直到出现异常   由于内存不足而致电。

引发

异常std::bad_alloc的原因是该进程试图分配一个太大的内存块(由OS认为)-有很多解决方法,但这不是这里的问题,问题是已经指出的无限循环。

为避免该特定问题,您可以改为使用基于范围的for循环(并避免在循环中使用push_back ),例如:

for(vector<int> prev : subsets){
  //do stuff...
}

答案 1 :(得分:1)

请记住,每次迭代都会对循环条件进行完整的评估。

您正在循环内扩展subsets,因此j将始终小于subsets.size()
这意味着循环将永远不会终止-至少直到内存用完或遇到其他“外部”问题时才会终止。

在循环之前保存限制:

const int limit = subsets.size();
for(int j = 0; j < limit; j++){
//...