如何在不修改原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
相关产品推荐
相关产品推荐

