繁体   English   中英

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

[英]Why does the line “subsets.push_back(n);” give me an error in the following code?

我想找到一组数字的幂集,并且有一些我无法用代码弄清楚的问题。 我应该做些什么改变?

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'的实例后终止调用“”

评论中所述

[您的代码包含] 无限循环 你正在循环中调用subsets.push_back ,所以subsets.size在每次循环迭代时都会增加,并且无法停止,直到由于内存不足而调用异常。

异常std::bad_alloc被抛出,因为进程正在尝试分配一个太大的内存块(正如操作系统所认为的那样) - 有办法解决这个问题,但这不是问题所在,问题是已经指出的无限循环。

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

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

请记住,在每次迭代时都会完整地评估循环条件。

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

在循环之前保存限制:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM