C++实现向量所有组合函数时遇for循环未执行问题排查
你的幂集函数循环未执行的原因及修正方案
问题分析
你的代码逻辑本身是正确的,for循环未执行的唯一合理场景是你传入了空的std::vector<int>——此时函数会直接进入original_list.empty()的分支,插入空集后返回,不会走到循环部分,这是符合幂集定义的(空集的幂集仅包含空集)。
如果传入的是非空vector,循环必然会执行,可能是你调试时的断点设置或结果检查有误,导致误以为循环没运行。
代码优化建议
原代码使用std::set<std::vector<int>>会带来不必要的排序和去重开销(递归生成的子集本身不会重复),建议改用std::vector<std::vector<int>>,同时将函数参数改为const引用以避免不必要的拷贝:
std::vector<std::vector<int>> power_set(const std::vector<int>& original_list) { std::vector<std::vector<int>> sets; if (original_list.empty()) { sets.push_back({}); return sets; } int head = original_list[0]; std::vector<int> rest(original_list.begin() + 1, original_list.end()); auto sub_sets = power_set(rest); for (const auto& lst2 : sub_sets) { std::vector<int> new_lst; new_lst.push_back(head); new_lst.insert(new_lst.end(), lst2.begin(), lst2.end()); sets.push_back(new_lst); sets.push_back(lst2); } return sets; }
验证测试
用以下测试代码可以确认函数正常工作:
#include <iostream> #include <vector> // 上述优化后的power_set函数 int main() { std::vector<int> test = {1, 2, 3}; auto subsets = power_set(test); std::cout << "所有子集:\n"; for (const auto& subset : subsets) { std::cout << "["; for (size_t i = 0; i < subset.size(); ++i) { if (i > 0) std::cout << ", "; std::cout << subset[i]; } std::cout << "]\n"; } return 0; }
运行后会输出8个子集,证明循环正常执行并生成了所有组合。
内容的提问来源于stack exchange,提问作者BarricadeX75
相关产品推荐
相关产品推荐

