将向量传递给函数,值与引用C++

Ada*_*dam 75 c++ arrays vector

我用C++编写代码.如果我有一些功能void foo(vector<int> test),我在程序中调用它,矢量是通过值还是引用传递的?我不确定,因为我知道向量和数组是相似的,并且类似的函数void bar(int test[])会通过引用(指针?)而不是值传递测试.我的猜测是,如果我想避免传递值,我需要明确地通过指针/引用传递向量,但我不确定.

Jor*_*eit 104

如果我不得不猜测,我会说你是来自Java背景.这是C++,除非您使用&-operator 另外指定,否则事物将按值传递(请注意,此运算符也用作'address-of'运算符,但在不同的上下文中).这些都有很好的记录,但无论如何我都会重复:

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifyable inside foo
void foo(vector<int> const &bar); // by const-reference
Run Code Online (Sandbox Code Playgroud)

您也可以选择将指针传递给vector(void foo(vector<int> *bar)),但除非您知道自己在做什么,并且您认为这确实是要走的路,否则请不要这样做.

此外,载体是一样的阵列!在内部,向量跟踪一个数组,它为您处理内存管理,但许多其他STL容器也是如此.您不能将向量传递给期望指针或数组的函数,反之亦然(您可以访问(指向)底层数组并使用它).向量是通过其成员函数提供许多功能的类,而指针和数组是内置类型.此外,动态分配向量(这意味着可以在运行时确定和更改大小),而静态分配C样式数组(其大小是常量并且必须在编译时已知),限制了它们的使用.

我建议你阅读更多关于C++的内容(特别是数组衰减),然后看看下面的程序,它说明了数组和指针之间的区别:

void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    foo1(arr);
    foo2(arr);
    foo3(arr);
    foo4(arr);
}
Run Code Online (Sandbox Code Playgroud)

  • 有人能帮我理解最后一个声明foo4的功能吗?为什么它会像其他函数一样返回数组的大小而不是指针的大小? (2认同)
  • @abhishek_M,因为参数类型是引用。引用只能绑定到完全相同类型的表达式。因此,数组不会衰减,因为无法将对数组的引用绑定到指针,所以只能将数组绑定到相同类型的数组(本例中为10个整数) (2认同)

Aja*_*jay 16

A vector在功能上与数组相同.但是,语言vector是一种类型,int也是一种类型.对于函数参数,任何类型(包括vector[])的数组都被视为指针.A vector<int>int[](编译器)不同.vector<int>是非数组,非引用和非指针 - 它是通过值传递的,因此它将调用copy-constructor.

因此,您必须使用vector<int>&(最好使用const,如果函数不修改它)将其作为参考传递.


rav*_*avi 8

void foo(vector<int> test)

vector将在此传递值.

根据上下文,您有更多方法传递向量: -

1)通过引用传递: - 这将使函数foo改变向量的内容.比传递值更有效,因为避免了向量的复制.

2)通过const-reference: - 当你不希望函数改变向量的内容时,这是有效的和可靠的.