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

如何在不修改原vector的情况下拼接元素并传入递归函数?

如何在不修改原vector的情况下拼接元素并传入递归函数?

嗨,我来帮你搞定这个问题~你碰到的编译错误是因为C++的std::vector根本没有重载+运算符,没法直接把vector和int这么拼接,所以arr + nums[index]这种写法编译器肯定不认啦。

你的核心需求是:在递归调用时传入一个包含新元素的vector,但绝对不能改动当前递归步骤里的原arr对吧?其实很简单,只要创建原vector的临时副本,在副本上添加元素,再把这个副本传给递归函数就行——这样原arr在当前作用域里完全不会被修改,完美符合你的要求。

给你几种具体的实现方式:

方法1:先拷贝再添加(最直观)

先把原arr拷贝到临时vector,再给临时vector加元素,最后传入递归:

// 先修正你的函数定义,第三个参数得有名字哦
void func(vector<int> nums, int idx, vector<int> arr) {
    // 一定要加递归终止条件,不然会栈溢出!
    if (idx >= nums.size()) {
        return;
    }
    // 创建临时副本,添加元素后传入递归
    vector<int> temp_arr = arr;
    temp_arr.push_back(nums[idx]);
    func(nums, idx + 1, temp_arr);
    // 这里的arr还是原来的样子,完全没被修改
}

方法2:一行搞定(更简洁,C++11及以上支持)

利用初始化列表直接构造新vector,包含原arr的所有元素再加新元素:

void func(vector<int> nums, int idx, vector<int> arr) {
    if (idx >= nums.size()) {
        return;
    }
    // 用初始化列表构造新vector,原arr不受任何影响
    func(nums, idx + 1, vector<int>{arr.begin(), arr.end(), nums[idx]});
}

方法3:用临时对象链式操作(稍显紧凑)

也可以直接在函数参数里构造临时vector并添加元素:

void func(vector<int> nums, int idx, vector<int> arr) {
    if (idx >= nums.size()) {
        return;
    }
    // 用lambda立即执行创建临时vector的逻辑,返回新对象传入递归
    func(nums, idx + 1, [&]() {
        vector<int> temp(arr);
        temp.push_back(nums[idx]);
        return temp;
    }());
}

你之前担心push_back会修改原arr,但其实这些操作都是在新的临时vector对象上做的,原arr在当前递归栈里还是原来的状态,完全不会被改动,放心用就行~

另外提醒一下,你的原函数定义里第三个vector<int>没有参数名,记得补上,不然没法在函数里使用哦。

备注:内容来源于stack exchange,提问作者samurai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:09:34