将vector传递给函数,值与参考C ++

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

如果我不得不猜测,我会说你来自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 

你也可以select传递一个指向vector的指针( void foo(vector<int> *bar) ),但是除非你知道你在做什么,并且你觉得这真的是要走的路,否则不要这个。

而且,向量与数组一样! 在内部,vector跟踪一个处理内存pipe理的数组,但是其他许多STL容器也是如此。 你不能将一个向量传递给一个期望指针或数组的函数,反之亦然(你可以访问(指向)底层数组,并使用它)。 向量是通过其成员函数提供大量function的类,而指针和数组是内置types。 此外,vector是dynamic分配的(这意味着大小可以在运行时确定和改变),而C风格的数组是静态分配的(它的大小是恒定的,必须在编译时知道),限制了它们的使用。

我build议你通常阅读一些关于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在function上与数组相同。 但是,语言vector是一个types, int也是一个types。 对于函数参数来说,任何types的数组(包括vector[] )都被当作指针。 一个vector<int>int[] (不同于编译器)是一样的。 vector<int>是非数组,非引用和非指针 – 它是通过值传递的,因此它将调用copy-constructor。

所以,你必须使用vector<int>& (最好用const ,如果函数没有修改它)传递它作为参考。

void foo(vector<int> test)

向量将在这个值传递。

你有更多的方法来传递vector取决于上下文:

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

2)通过const引用传递: – 当你不想要函数改变向量的内容时,这是有效的和可靠的。

我明白这个问题的答案。 我想强调一个更重要的方面:

如果向量是用户定义的数据types,那么types必须实现适当的复制构造,以便向量被作为引用调用的函数修改,如果函数更新由于push_back该UDT的局部variables。

所以,如果你传递一个

 vector<A> vA; 

到一个function

 void foo(vector<A> &vA){ A a; vA.push_back(a); // do something with the vector } 

那么类A必须定义拷贝构造函数才能使函数更新向量。

 class A{ .. int x; void A(A& orig){ this->x = orig.x; } };