gpt4 book ai didi

c++ - C++中嵌套增强for循环的作用域

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:09 29 4
gpt4 key购买 nike

这是我生成集合的幂集的代码,但它没有按预期工作。

#include <string>
#include <stdio.h>
#include <vector>

using namespace std;

vector<vector<int>> powerSet(vector<int> set){
vector<vector<int>> result;
vector<int> emptySet;
result.push_back(emptySet);

for(int i: set){
for(vector<int> subSet:result){
subSet.push_back(i);
result.push_back(subSet);
}
}

return result;
}

int main(){
vector<int> a = {1, 2, 3};
vector<vector<int>> r = powerSet(a);

for(vector<int> v: r){
for(int n : v){
printf("%d ", n);
}
printf("\n");
}
return 0;
}

此代码打印:

1
2
2
3
3
3
3

稍微修改一下,就可以了。这是我的工作代码:

#include <string>
#include <stdio.h>
#include <vector>

using namespace std;

vector<vector<int>> powerSet(vector<int> set){
vector<vector<int>> result;
vector<int> emptySet;
result.push_back(emptySet);

for(int i: set){
vector<vector<int>> moreSets; // here is the changes
for (vector<int> subSet: result){
subSet.push_back(i);
moreSets.push_back(subSet); // here is the changes
}
result.insert(result.end(), moreSets.begin(), moreSets.end()); // here is the changes }

return result;
}

int main(){
vector<int> a = {1, 2, 3};
vector<vector<int>> r = powerSet(a);

for(vector<int> v: r){
for(int n : v){
printf("%d ", n);
}
printf("\n");
}
return 0;
}

谁能告诉我第一个代码的问题是什么?太感谢了!

最佳答案

在第一个代码中看下面的代码

for(vector<int> subSet:result){
subSet.push_back(i);
result.push_back(subSet);
}

您正在更改您正在迭代的结果。这不会有好结果,甚至可能导致无限循环、程序崩溃等。

Range-based for loopbegin(container)end(container) 之间迭代,它们是通过参数相关查找找到的(不执行非 ADL 查找)。

如果您更改 loop_statement 中的容器,先前(内部使用的)迭代器将无效,从而导致未定义的行为。

更多细节请阅读6.5.4 基于范围的for语句[stmt.ranged]


相关帖子:Erasing an element from a container while inside a range-based for loop

关于c++ - C++中嵌套增强for循环的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773562/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com