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

时间:2016-10-14 17:10:00

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

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

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

然后它应该传递对向量的引用,但它是否与数组一样? 向量是使用数组实现的,所以我的假设是当我传递一个引用时,它只是传递第一个元素的地址。它是否正确?

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

3 个答案:

答案 0 :(得分:5)

std::vector 与原始C风格数组非常不同,因此如果您通过引用传递std::vector,则无法说出该项中第一项的地址std::vector是传递给函数的内容。

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

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

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

答案 1 :(得分:0)

如果通过引用传递矢量,则传递整个数组并进行编辑。它不传递第一个元素的地址。否则,如果您没有通过引用传递,它只会复制该数组。

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

答案 2 :(得分:0)

一般来说:

  • void foo(Bar b) - 按值传递,b是副本或原始Bar
  • void foo(Bar& b) - 通过引用传递,您可以修改原始Barb
  • void foo(Bar* b) - 通过指针传递,您可以修改原始Barb(只要b不为空)。
  • void foo(const Bar& b) - 通过const引用传递,b是原始Bar,但您无法在foo的范围内对其进行修改。
  • void foo(const Bar* b) - 传递指针指向const,b是指向原始Bar的指针,但您无法在foo的范围内修改它。
  • void foo(Bar* const b) - 通过const指针传递,b是指向原始Bar的指针,原始Bar可以修改(只要b }不是null),但你无法改变b指向的内容。
  • void foo(const Bar* const b) - 通过const指针指向const,您无法更改原始Bar,也无法更改b范围内foo指向的内容。