向量的自动参考?

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)在本地范围内更改时,引用才相关。

Sha*_*ger 5

auto默认既不是const也不是参考。for (auto i : with) {按值存储也是如此i,它为每个嵌套的vectors 调用复制构造函数。vector该副本与您的of中存储的版本无关vector,因此当副本消失时,不会保留任何更改。您添加的&使其成为一个为底层内部别名的引用vector,因此对引用的更改会更改原始vector.

如果您不想更改有问题的对象,有效的方法是使用const auto&防止更改和避免复制;您很少想以这种方式按值进行迭代,除非您确实想要一个不会影响原始副本的可变副本,因为副本构造函数的成本可能会变得非常令人讨厌。

  • @bayesianpower你真的应该从一本[好的c++书](/sf/ask/27176971/)开始。你所有的问题都是关于基本的 C++ 概念,比如值和引用,你应该真正从一个好的来源学习它们,而不是在黑暗中投掷飞镖,希望能坚持下来,然后试图弄清楚基本概念。 (2认同)