You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:55:24