【问题标题】:Are STL vectors pass by reference/address?STL 向量是否通过引用/地址传递?
【发布时间】:2022-01-15 11:32:52
【问题描述】:

我正在解决一个递归问题。在解决问题时,我陷入了无法弄清楚的境地:

#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&lt;int&gt; Search——也起到了作用。
  • 因为你使用的是返回的向量
  • 在这两种情况下,您都按值返回。但是没有“默认通过引用传递”或类似的类型。值是按值传递的,除非你明确地通过引用传递。
  • 无关,但你真的不应该使用#include&lt;bits/stdc++.h&gt;。它不是标准的 C++,也不是可移植的。请改用#include&lt;vector&gt;

标签: c++ recursion stl


【解决方案1】:

在通过引用传递的情况下,您将推送到您传入的同一 vector

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

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多