【问题标题】:How is pass by reference different from static引用传递与静态有何不同
【发布时间】:2021-05-23 19:08:53
【问题描述】:

我正在做一个 leetcode 问题,我使用的是 static index,每次函数调用自身时我都会迭代它。当我在 VSCode 上运行它时,它给了我想要的输出,但是当我将它提交给 leetcode 时,它​​显示我超出了范围值。我做了一些试验和错误,我发现如果我在函数中声明 index 为通过引用传递,则接受该解决方案。这让我开始思考代码的这种变化会在内部产生什么影响。下面是我的函数代码。

    TreeNode* helper(vector<int>& preorder, vector<int>& inorder,int start,int end,int &index){
        if(start>end) return NULL;
        // static int index = 0; //It was declared here prior to moving it above in function
        int curr = preorder.at(index);
        TreeNode *node = new TreeNode(curr);
        index++;
        if(start==end) return node;
        int pos = search(inorder,curr,start,end);
        node->left = helper(preorder,inorder,start,pos-1,index);
        node->right = helper(preorder,inorder,pos+1,end,index);
        return node;
    }

(代码是关于从 preOrder 和 inOrder 构造二叉树以防万一有人想知道)。

【问题讨论】:

    标签: c++ pass-by-reference


    【解决方案1】:

    主要区别在于static 局部变量只会被初始化一次。函数第一次运行。

    您没有显示用例以及如何传递和初始化索引。但这是最可能的原因。静态索引可能只是保留了之前运行的值。

    其他区别:

    索引变量只有一个静态实例。如果你通过引用传递一些东西,你可以传递不同的。

    通过引用传递的值可以在别处修改。静态局部变量只能在该函数中修改。

    【讨论】:

    • 它是用来保存函数的前一个值。实际上,它只是一个指针,这样我就可以从 preOrder 数组中更新 curr 值。所以最初 i=0 并且我们插入了 preOrder 的第一个值。之后,我们增加 i ,然后 curr 必须有第二个值。它在我的编译器和 leetcode 运行代码部分中也运行良好,但在提交代码时给了我超出范围的错误
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2017-04-26
    • 1970-01-01
    • 2011-12-01
    • 2014-04-06
    相关资源
    最近更新 更多