C++排列结果存入vector异常:循环中vector重置为空的解决问询
解决排列结果存入vector时被重置的问题
嘿,我来帮你捋清楚这个问题!你遇到的核心问题应该是vector的作用域不对或者用错了工具(for_each并不适合用来生成并收集排列),咱们一步步解决:
为什么vector会被重置为size=0?
大概率是这两个原因之一:
- 你在
for_each的回调函数里重新定义了vector,每次回调都会新建一个空容器,自然每次迭代都是size=0; for_each本身是用来遍历已存在的元素序列,不是用来动态生成排列的,用它来收集排列结果本身就不符合它的设计场景。
正确收集所有排列的方法
要生成并保存一个序列的所有排列,推荐用next_permutation结合do-while循环,既能确保第一个排列被保存,又能自动终止在所有排列生成完毕时:
示例代码
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { // 初始序列(记得先升序排序,不然next_permutation会从当前序列开始生成,可能漏排列) vector<int> seq = {1, 2, 3}; sort(seq.begin(), seq.end()); // 存储所有排列的容器,必须定义在循环外面! vector<vector<int>> all_perms; // do-while:先保存初始排列,再生成后续排列 do { all_perms.push_back(seq); // 将当前排列存入容器 } while (next_permutation(seq.begin(), seq.end())); // 验证一下结果 cout << "所有排列:" << endl; for (auto& perm : all_perms) { for (int num : perm) { cout << num << " "; } cout << endl; } // 后续和另一个vector比对的示例 vector<int> target = {2, 1, 3}; bool is_exist = false; for (auto& perm : all_perms) { // vector可以直接用==运算符比对元素是否完全一致 if (perm == target) { is_exist = true; break; } } cout << "\n目标排列是否存在:" << (is_exist ? "是" : "否") << endl; return 0; }
关键细节说明
- 容器作用域:
all_perms必须定义在循环外部,这样每次迭代都是往同一个容器里添加元素,而不是每次新建空容器; - do-while的必要性:
next_permutation会把序列修改为下一个字典序排列,当序列已是最后一个排列时返回false。用do-while能先保存初始的第一个排列,再进入循环生成后续的; - 初始序列排序:如果你的初始序列不是升序,一定要先sort,否则
next_permutation只会生成从当前序列开始的后续排列,会漏掉前面的排列。
关于while循环的疑问
你之前尝试while循环但找不到合适条件,其实next_permutation的返回值就是天然的循环终止条件——当它返回false时,所有排列都已生成完毕,这也是do-while比单纯while更合适的原因(能覆盖第一个排列)。
内容的提问来源于stack exchange,提问作者MacGenius
相关产品推荐
相关产品推荐

