STL 向量是否通过 reference/address?

Are STL vectors pass by reference/address?

我正在解决一个递归问题。在解决的过程中,我陷入了一个我无法弄清楚的位置:

#include<bits/stdc++.h>
using namespace std;

vector<int> Search(int arr[],int in, int n, int t, vector<int> &v){//v passed as ref.
    if(in == n){
        return v;
    }
    if(arr[in] == t){
        v.push_back(in);
    }
    return Search(arr, in+1, n, t, v);
}

int main(){
    int arr[] = {1, 2, 3, 4, 5, 4, 7, 4, 9, 4};
    vector<int> v;
    v = Search(arr, 0, 10, 4, v);
    for(int i = 0; i < v.size(); i++){
        cout << v.at(i) << endl;
    }
    return 0;
}

在此代码中,我将 v 作为参考传递,但是当我尝试在没有参考的情况下传递它时,有趣的是,这两个代码都有效。

#include<bits/stdc++.h>
using namespace std;

vector<int> Search(int arr[], int in, int n, int t, vector<int> v){
    if(in == n){
        return v;
    }
    if(arr[in] == t){
        v.push_back(in);
    }
    return Search(arr, in+1, n, t, v);
}

int main(){
    int arr[] = {1, 2, 3, 4, 5, 4, 7, 4, 9, 4};
    vector<int> v;
    v = Search(arr, 0, 10, 4, v);
    for(int i = 0; i < v.size(); i++){
        cout << v.at(i) << endl;
    }
    return 0;
}

你能解释一下为什么会这样吗?

在通过引用传递的情况下,您将推入与传入相同的 vector

然而,当您按值传递时,您将推入 vector副本。但是随后您返回 vector,其中 returns 是本地副本,然后您将其(最终)分配给 main 中的 vector v。这就是使代码看起来像做同样事情的原因,即使实际上并没有。