bay*_*wer 1 c++ iterator stl reference range-based-loop
i以下代码不会改变for 循环中的内容:
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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其更改为auto& i : with ...,它就会起作用。有理由吗?我认为只有当您使用指向的对象或者您不希望变量(在本例中i)在本地范围内更改时,引用才相关。
auto默认既不是const也不是参考。for (auto i : with) {按值存储也是如此i,它为每个嵌套的vectors 调用复制构造函数。vector该副本与您的of中存储的版本无关vector,因此当副本消失时,不会保留任何更改。您添加的&使其成为一个为底层内部别名的引用vector,因此对引用的更改会更改原始vector.
如果您不想更改有问题的对象,有效的方法是使用const auto&防止更改和避免复制;您很少想以这种方式按值进行迭代,除非您确实想要一个不会影响原始副本的可变副本,因为副本构造函数的成本可能会变得非常令人讨厌。