我用C ++编写代码。如果我有一些函数void foo(vector<int> test)
并且我在我的程序中调用它,那么向量是通过值还是引用传递的?我不确定,因为我知道向量和数组是相似的,像void bar(int test[])
这样的函数会通过引用(指针?)而不是值传递测试。我的猜测是,我需要明确地通过指针/引用传递向量,如果我想避免传递值,但我不确定。
答案 0 :(得分:94)
如果我不得不猜测,我会说你是来自Java背景。这是C ++,除非您使用&
- 运算符另行指定,否则事物将按值传递(请注意,此运算符也用作&#39;地址 - &#39;运算符,但在不同的上下文中)。这些都有详细记录,但无论如何我都会重复:
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
您也可以选择将指针传递给矢量(void foo(vector<int> *bar)
),但除非您知道自己正在做什么,并且您认为这是真的要走的路,否则请不要这样做。这样做。
此外,矢量不与数组相同!在内部,向量跟踪一个数组,它为您处理内存管理,但许多其他STL容器也是如此。您不能将向量传递给期望指针或数组的函数,反之亦然(您可以访问(指向)底层数组并使用它)。向量是通过其成员函数提供许多功能的类,而指针和数组是内置类型。此外,向量是动态分配的(这意味着可以在运行时确定和更改大小),而C样式数组是静态分配的(它的大小是常量,必须在编译时知道),限制了它们的使用。
我建议你阅读更多关于C ++的内容(特别是array decay),然后看看下面的程序,它说明了数组和指针之间的区别:
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);
}
答案 1 :(得分:15)
vector
在功能上与数组相同。但是,语言vector
是一种类型,int
也是一种类型。对于函数参数,任何类型的数组(包括vector[]
)都被视为指针。 vector<int>
与int[]
(与编译器)不同。 vector<int>
是非数组,非引用和非指针 - 它是按值传递的,因此它将调用copy-constructor。
因此,您必须使用vector<int>&
(最好使用const
,如果函数没有修改它),将其作为参考传递。
答案 2 :(得分:8)
void foo(vector<int> test)
vector将在此传递值。
根据上下文,您有更多传递向量的方法: -
1)通过引用传递: - 这将使函数foo改变向量的内容。比传递值更有效,因为避免了矢量的复制。
2)通过const-reference: - 当你不希望函数改变向量的内容时,这是有效的,也是可靠的。
答案 3 :(得分:1)
当我们在函数中按值传递向量作为参数时,它只是创建向量的副本,并且当调用该特定函数时,对主函数中定义的向量没有任何影响。 而当我们通过引用传递矢量时,在该特定函数中编写的内容, 当我们调用特定函数时,每一个动作都会对在main或其他函数中定义的向量执行。