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) ),但除非您知道're doing and you feel that this is really is the way to go, don' t这样做 .
3 回答
如果我不得不猜测,我是来自Java背景的.765683_ . 这是C,除非您使用
&
-operator另外指定,否则事物将按值传递(请注意,此运算符也用作'address-of'运算符,但在不同的上下文中) . 这些都有很好的记录,但无论如何我都会重复:您也可以选择将指针传递给向量(
void foo(vector<int> *bar)
),但除非您知道're doing and you feel that this is really is the way to go, don' t这样做 .另外,矢量与数组不同!在内部,向量跟踪一个数组,它为您处理内存管理,但许多其他STL容器也是如此 . 您不能将向量传递给期望指针或数组的函数,反之亦然(您可以访问(指向)底层数组并使用它) . 向量是通过其成员函数提供许多功能的类,而指针和数组是内置类型 . 此外,动态分配向量(这意味着可以在运行时确定和更改大小),而静态分配C样式数组(其大小是常量并且必须在编译时知道),限制了它们的使用 .
我建议你阅读一些关于C的更多信息(特别是array decay),然后看看下面的程序,它说明了数组和指针之间的区别:
vector
在功能上与数组相同 . 但是,对于语言vector
是一种类型,int
也是一种类型 . 对于函数参数,任何类型的数组(包括vector[]
)都被视为指针 .vector<int>
与int[]
(与编译器)不同 .vector<int>
是非数组,非引用和非指针 - 它是按值传递的,因此它将调用copy-constructor .因此,您必须使用
vector<int>&
(最好使用const
,如果函数未修改它)将其作为参考传递 .void foo(vector<int> test)
vector将在此传递值 .
根据上下文,您有更多传递向量的方法: -
1)通过引用传递: - 这将使函数foo改变向量的内容 . 比传递值更有效,因为避免了向量的复制 .
2)通过const-reference: - 当你不希望函数改变向量的内容时,这是有效的和可靠的 .