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

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中第一项的地址,你可以使用&amp;v[0]或者v.data()来获取。

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

【讨论】:

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

一般:

void foo(Bar b) - 按值传递,b 是副本或原始 Barvoid foo(Bar&amp; b) - 引用传递,可以修改原来的Barbvoid 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】:

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

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

【讨论】:

以上是关于将向量的引用作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

将向量作为函数参数传递

将向量数组作为函数参数传递以更改原始值

如何将向量的一部分作为函数参数传递?

将对象向量的指针作为参数传递,但有很多不同

如何将多个参数作为单个向量传递给函数?

值传递和引用传递的区别