将对向量的引用作为参数传递

Passing a reference to a vector as a parameter

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

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

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

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

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

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

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

std::vector 里面的逻辑不仅仅是 "raw C-style array"。

如果你想要向量中第一项的地址,你可以使用 &v[0]v.data().

来获取它

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

总的来说:

  • void foo(Bar b) - 按值传递,b是副本或原始Bar
  • void foo(Bar& b) - 引用传递,可以通过b.
  • 修改原来的Bar
  • void foo(Bar* b)——指针传递,可以通过b修改原来的Bar(只要b不为空)。
  • void foo(const Bar& 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 也不能更改 b 指向 [=23= 范围内的内容].