我在用c++编程。如果我有一些功能 void foo(vector<int> test) 我在程序中调用它,向量是通过值传递还是通过引用传递?我不确定,因为我知道向量和数组是相似的,函数 void bar(int test[]) 将按引用(指针?)而不是按值通过测试。我的猜测是,如果我想避免传递值,我需要显式地通过指针/引用传递向量,但我不确定。
void foo(vector<int> test)
void bar(int test[])
eblbsuwk1#
一 vector 在功能上与数组相同。但是,对于语言 vector 是一种类型,并且 int 也是一种类型。对于函数参数,任何类型的数组(包括 vector[] )被视为指针。一 vector<int> 不等于 int[] (对编译器说)。 vector<int> 是非数组、非引用和非指针—它是按值传递的,因此它将调用复制构造函数。所以,你必须使用 vector<int>& (最好是 const ,如果函数没有修改它),则将其作为引用传递。
vector
int
vector[]
vector<int>
int[]
vector<int>&
const
k5hmc34c2#
void foo(vector<int> test) 向量将按此中的值传递。你有更多的方法来传递向量,这取决于context:-1) 路过reference:- this 将让函数foo更改向量的内容。由于避免了向量的复制,因此比传递值更有效。2) 通行证-reference:- this 当您不希望函数更改向量的内容时,它既高效又可靠。
7rtdyuoh3#
如果非要我猜的话,我会说你有java背景。这是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) )但是,除非你知道自己在做什么,并且你觉得这真的是一条路要走,否则不要这样做。而且,向量和数组不一样!在内部,vector跟踪它为您处理内存管理的数组,但其他许多stl容器也是如此。不能将向量传递给需要指针或数组的函数,反之亦然(您可以访问(指向)底层数组的指针并使用它)。向量是通过其成员函数提供大量功能的类,而指针和数组是内置类型。另外,向量是动态分配的(这意味着可以在运行时确定和更改大小),而c样式数组是静态分配的(其大小是恒定的,必须在编译时知道),从而限制了它们的使用。我建议您多读一些关于c++的一般知识(特别是数组衰减),然后看看下面的程序,它说明了数组和指针之间的区别:
void foo(vector<int> *bar)
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); }
kmb7vmvb4#
当我们在函数中按值传递向量作为参数时,它只是创建向量的副本,当我们调用特定函数时,不会对主函数中定义的向量产生任何影响。当我们通过引用传递向量时,不管在那个特定函数中写了什么,当我们调用那个特定函数时,每个动作都将在main或其他函数中定义的向量上执行。
4条答案
按热度按时间eblbsuwk1#
一
vector
在功能上与数组相同。但是,对于语言vector
是一种类型,并且int
也是一种类型。对于函数参数,任何类型的数组(包括vector[]
)被视为指针。一vector<int>
不等于int[]
(对编译器说)。vector<int>
是非数组、非引用和非指针—它是按值传递的,因此它将调用复制构造函数。所以,你必须使用
vector<int>&
(最好是const
,如果函数没有修改它),则将其作为引用传递。k5hmc34c2#
void foo(vector<int> test)
向量将按此中的值传递。你有更多的方法来传递向量,这取决于context:-
1) 路过reference:- this 将让函数foo更改向量的内容。由于避免了向量的复制,因此比传递值更有效。
2) 通行证-reference:- this 当您不希望函数更改向量的内容时,它既高效又可靠。
7rtdyuoh3#
如果非要我猜的话,我会说你有java背景。这是c++,除非使用
&
-运算符(请注意,此运算符也用作“address of”运算符,但在不同的上下文中)。这些都有很好的文档记录,但我还是会重复:也可以选择将指针传递给向量(
void foo(vector<int> *bar)
)但是,除非你知道自己在做什么,并且你觉得这真的是一条路要走,否则不要这样做。而且,向量和数组不一样!在内部,vector跟踪它为您处理内存管理的数组,但其他许多stl容器也是如此。不能将向量传递给需要指针或数组的函数,反之亦然(您可以访问(指向)底层数组的指针并使用它)。向量是通过其成员函数提供大量功能的类,而指针和数组是内置类型。另外,向量是动态分配的(这意味着可以在运行时确定和更改大小),而c样式数组是静态分配的(其大小是恒定的,必须在编译时知道),从而限制了它们的使用。
我建议您多读一些关于c++的一般知识(特别是数组衰减),然后看看下面的程序,它说明了数组和指针之间的区别:
kmb7vmvb4#
当我们在函数中按值传递向量作为参数时,它只是创建向量的副本,当我们调用特定函数时,不会对主函数中定义的向量产生任何影响。当我们通过引用传递向量时,不管在那个特定函数中写了什么,当我们调用那个特定函数时,每个动作都将在main或其他函数中定义的向量上执行。