是在C++中通过值或引用传递给函数的向量

Are vectors passed to functions by value or by reference in C++

本文关键字:函数 向量 引用 C++ 是在      更新时间:2023-10-16

我正在用C++进行编码。如果我有一些函数void foo(vector<int> test),并且我在程序中调用它,向量会通过值还是引用传递?我不确定,因为我知道向量和数组是相似的,而且像void bar(int test[])这样的函数会通过引用(指针?)而不是通过值来通过测试。我的猜测是,如果我想避免按值传递,但我不确定,我需要显式地通过指针/引用传递向量。

在C++中,除非您使用&-运算符指定,否则事物都是按值传递的(请注意,此运算符也用作"address of"运算符,但在不同的上下文中)。这一切都有很好的记录,但我无论如何都会重新迭代:

void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference

你也可以选择将指针传递给向量(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);
}

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

所以,必须使用vector<int>&(最好和const一起使用,若函数并没有对其进行修改的话)将其作为引用传递。

void foo(vector<int> test)

向量将通过中的值传递。

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

1) 通过引用传递:-这将使函数foo更改向量的内容。由于避免了矢量的复制,因此比传递值更有效率。

2) 传递常量引用:-当您不希望函数更改向量的内容时,这既有效又可靠。

当我们在函数中逐值传递vector作为参数时,它只会创建vector的副本,当我们调用该特定函数时,不会对主函数中定义的vector产生任何影响。而当我们通过引用向量时,无论在那个特定函数中写什么,当我们调用这个特定函数时,每个动作都将在main或其他函数中定义的向量上执行。