gpt4 book ai didi

c++ - 自动引用 vector ?

转载 作者:行者123 更新时间:2023-12-01 15:10:20 26 4
gpt4 key购买 nike

以下代码不会更改for循环中i的内容:

class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
if (target == 0) {return vector<vector<int>>{{}};}
else if (!candidates.size() || target < 0) {return vector<vector<int>>();}
else {
vector<vector<int>> with = combinationSum(candidates, target - candidates[0]);
vector<int> new_vector(candidates.begin() + 1, candidates.end());
vector<vector<int>> without = combinationSum(new_vector, target);
for (auto i : with) {i.push_back(candidates[0]);}

with.insert(with.end(), without.begin(), without.end());
return with;

}
}
};

但是,如果我将其更改为 auto& i : with ...,它将起作用。有什么理由吗?我认为,仅当您使用尖的对象或不希望变量(在这种情况下为 i)在本地范围内更改时,引用才有意义。

最佳答案

auto默认既不是const也不是引用。因此,for (auto i : with) {按值存储到i中,这将为每个嵌套的vector调用复制构造函数。该副本与存储在vectorvector中的版本无关,因此当副本消失时,更改不会持久。您添加的&使其成为对基础内部vector进行别名的引用,因此对引用的更改将更改原始vector
如果您不想更改所讨论的对象,执行此操作的有效方法是使用const auto&来防止更改并避免复制。除非您真的想要一个不会影响原始副本的可变副本,否则您很少希望通过这种方式按值进行迭代,因为副本构造函数的成本可能会令人讨厌。

关于c++ - 自动引用 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com