gpt4 book ai didi

基于 C++ 范围的 for 循环和元素拷贝

转载 作者:行者123 更新时间:2023-12-02 10:21:02 25 4
gpt4 key购买 nike

我想生成给定 vector 的所有子集:

vector<vector<int>> findSubsets(const vector<int> &nums) {
vector<vector<int>> subsets;
subsets.push_back(vector<int>{}); //empty set
for (auto current_num : nums)
{
//add current_num to all existing subsets
int n = subsets.size();
for (int i = 0; i < n; i++) {
vector<int> set(subsets[i]);
set.push_back(num);
subsets.push_back(set);
}
}
return subsets;
}


我想使用基于范围的 for 循环来迭代所有子集,它会给出不同的结果:
vector<vector<int>> findSubsets(const vector<int> &nums) {
vector<vector<int>> subsets;
subsets.push_back(vector<int>{}); //empty set
for (auto current_num : nums)
{
//add current_num to all existing subsets
for (vector<int> subset : subsets)
{
subset.push_back(current_num);
subsets.push_back(subset);
}
}
return subsets;
}

但这并没有达到我的预期。我错过了什么?

最佳答案

正如@Fureeish 在评论中提到的,第二个版本的一个问题是在迭代子集 vector 时插入子集 vector 。

for (vector<int> subset : subsets)
{
subset.push_back(current_num);
subsets.push_back(subset); // Should not modify vector while iterating on it
}

range 语句扩展为:
{

auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {

range_declaration = *__begin;
loop_statement
}
}

__end 表达式在迭代之前展开。对于 vector ,这可能是计算 vector.data[size] 处的地址。如果循环将新元素插入 vector 中,则 __end 表达式不再正确。

如果您改为遍历 vector 的拷贝,则 range 语句将起作用。例如:
    for (vector<int> subset : vector<vector<int>>(subsets))
{
subset.push_back(current_num);
subsets.push_back(subset);
}

关于基于 C++ 范围的 for 循环和元素拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60136317/

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