【问题标题】:Passing a reference to a vector as a parameter将向量的引用作为参数传递
【发布时间】:2017-02-24 04:54:09
【问题描述】:

我知道当你传递一个数组作为参数时,你基本上是在索引0处传递数组的地址。然后,硬件知道int通常是4个字节,所以它可以很容易地访问其他元素。 我的问题是关于矢量的。 如果我有一个功能

 void bla(std::vector<int> &arr)
    {
    }

那么它应该传递一个对向量的引用,但它会像数组一样发生吗? 向量是使用数组实现的,所以我的假设是当我传递一个引用时,它只是传递第一个元素的地址。对不对?

另外,如果我只是作为向量传递,会发生什么?它会在堆栈上创建一个副本吗? 谢谢

【问题讨论】:

    标签: c++ vector parameter-passing pass-by-reference


    【解决方案1】:

    std::vector 与原始 C 样式数组非常不同,因此如果您通过引用传递 std::vector,没有人可以说 std::vector 中第一项的地址是传递给函数的内容。

    std::vector 内部,逻辑不仅仅是“原始 C 样式数组”。

    如果你想要vector中第一项的地址,你可以使用&amp;v[0]或者v.data()来获取。

    如果您按值传递向量,您将获得原始向量的副本。并且您在函数中对该副本所做的所有修改都不会反映到原始版本中。

    【讨论】:

    • 好的,所以当我通过引用传递向量时,我传递了一些地址,然后硬件可以以某种方式只使用一个地址获取向量,对吗?
    【解决方案2】:

    一般:

    • void foo(Bar b) - 按值传递,b 是副本或原始 Bar
    • void foo(Bar&amp; b) - 引用传递,可以修改原来的Barb
    • void foo(Bar* b) - 通过指针传递,可以修改原来的Barb(只要b不为空)。
    • void foo(const Bar&amp; b) - 通过 const 引用传递,b 是原始的 Bar 但您不能在 foo 的范围内修改它。
    • void foo(const Bar* b) - 通过指向常量的指针传递,b 是指向原始 Bar 的指针,但您不能在 foo 的范围内修改它。
    • void foo(Bar* const b)——通过const指针传递,b是指向原Bar的指针,原Bar可以修改(只要b不为空),但不能改什么b 指向。
    • void foo(const Bar* const b) - 传递 const 指向 const 的指针,你不能改变原来的 Bar 也不能改变 bfoo 范围内指向的东西。

    【讨论】:

      【解决方案3】:

      如果通过引用传递向量,则传递整个数组并且可以进行编辑。它不传递第一个元素的地址。否则,如果不通过引用传递,它只会复制数组。

      来源:学校编码经验(如果不准确,请编辑)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        • 2014-03-03
        相关资源
        最近更新 更多