将向量的引用作为参数传递
Posted
技术标签:
【中文标题】将向量的引用作为参数传递【英文标题】:Passing a reference to a vector as a parameter 【发布时间】:2017-02-24 04:54:09 【问题描述】:我知道当你传递一个数组作为参数时,你基本上是在索引0处传递数组的地址。然后,硬件知道int通常是4个字节,所以它可以很容易地访问其他元素。 我的问题是关于矢量的。 如果我有一个功能
void bla(std::vector<int> &arr)
那么它应该传递一个对向量的引用,但它会像数组一样发生吗? 向量是使用数组实现的,所以我的假设是当我传递一个引用时,它只是传递第一个元素的地址。对不对?
另外,如果我只是作为向量传递,会发生什么?它会在堆栈上创建一个副本吗? 谢谢
【问题讨论】:
【参考方案1】:std::vector
与原始 C 样式数组非常不同,因此如果您通过引用传递 std::vector
,没有人可以说 std::vector
中第一项的地址是传递给函数的内容。
在std::vector
内部,逻辑不仅仅是“原始 C 样式数组”。
如果你想要vector中第一项的地址,你可以使用&v[0]
或者v.data()
来获取。
如果您按值传递向量,您将获得原始向量的副本。并且您在函数中对该副本所做的所有修改都不会反映到原始版本中。
【讨论】:
好的,所以当我通过引用传递向量时,我传递了一些地址,然后硬件可以以某种方式只使用一个地址获取向量,对吗?【参考方案2】:一般:
void foo(Bar b)
- 按值传递,b
是副本或原始 Bar
。
void foo(Bar& b)
- 引用传递,可以修改原来的Bar
到b
。
void foo(Bar* b)
- 通过指针传递,可以修改原来的Bar
到b
(只要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
在foo
范围内指向的东西。
【讨论】:
【参考方案3】:如果通过引用传递向量,则传递整个数组并且可以进行编辑。它不传递第一个元素的地址。否则,如果不通过引用传递,它只会复制数组。
来源:学校编码经验(如果不准确,请编辑)。
【讨论】:
以上是关于将向量的引用作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章