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

Why does the line "subsets.push_back(n);" give me an error in the following code?

本文关键字:代码 错误 一个 subsets push 为什么 back      更新时间:2023-10-16

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

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是因为该过程试图分配A 太大内存块(如OS所认为的( - 有些方面 - 但这不是问题,但这里的问题是如已经指出的无限循环。

要避免使用该特定问题,您可以将基于范围的循环使用(并且避免在循环中的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++){
//...