C++字符串全排列存入vector失败,请求代码错误排查
问题排查与修复方案
你的代码存在两个核心问题,导致无法正确存储和输出全排列:
1. 变量名冲突
全局定义的vector<string> str和main函数里的局部char str[] = "ABC"重名了。这会导致:
permute函数里的str.push_back(a)操作的是全局的vector,但main里遍历的是局部的char数组,完全不是同一个对象,自然输出的不是存储的排列。- 局部变量会屏蔽全局变量,这是C++的名字查找规则导致的。
2. 存储的是指针引用而非实际字符串
即使解决了名字冲突,str.push_back(a)的写法也有问题:a是指向同一个char数组的指针,回溯过程中数组内容会不断被修改,最终vector里所有的string都会指向同一个内存地址,存储的是最后一次排列的结果,而不是每一次的排列。
修复后的完整代码
#include <bits/stdc++.h> using namespace std; // 重命名全局vector,避免和局部变量冲突 vector<string> permutations; void swap(char* x, char* y) { char temp = *x; *x = *y; *y = temp; } void permute(char* a, int l, int r) { if (l == r) { cout << a << endl; // 将char数组转换为string对象存入,保存当前状态的副本 permutations.push_back(string(a)); } else { for (int i = l; i <= r; i++) { swap(a + l, a + i); permute(a, l + 1, r); swap(a + l, a + i); // 回溯 } } } int main() { char input[] = "ABC"; int n = strlen(input); permute(input, 0, n - 1); // 遍历全局的vector输出所有排列 cout << "\n存储的全排列:" << endl; for (const string& s : permutations) { cout << s << endl; } return 0; }
关键修复点说明
- 变量名重命名:把全局vector改名为
permutations,和局部的char数组input区分开,避免名字冲突。 - 存储字符串副本:用
string(a)把当前char数组的内容转换成一个新的string对象存入vector,这样每个元素都是独立的排列副本,不会被后续的回溯修改影响。 - 遍历vector的正确方式:使用范围for循环遍历全局的
permutations,确保输出的是存储的全排列。
内容的提问来源于stack exchange,提问作者Harsh Kumar
相关产品推荐
相关产品推荐

