Ada*_*dam 75 c++ arrays vector
我用C++编写代码.如果我有一些功能void foo(vector<int> test),我在程序中调用它,矢量是通过值还是引用传递的?我不确定,因为我知道向量和数组是相似的,并且类似的函数void bar(int test[])会通过引用(指针?)而不是值传递测试.我的猜测是,如果我想避免传递值,我需要明确地通过指针/引用传递向量,但我不确定.
Jor*_*eit 104
如果我不得不猜测,我会说你是来自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
Run Code Online (Sandbox Code Playgroud)
您也可以选择将指针传递给vector(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);
}
Run Code Online (Sandbox Code Playgroud)
Aja*_*jay 16
A vector在功能上与数组相同.但是,语言vector是一种类型,int也是一种类型.对于函数参数,任何类型(包括vector[])的数组都被视为指针.A vector<int>与int[](编译器)不同.vector<int>是非数组,非引用和非指针 - 它是通过值传递的,因此它将调用copy-constructor.
因此,您必须使用vector<int>&(最好使用const,如果函数不修改它)将其作为参考传递.
void foo(vector<int> test)
vector将在此传递值.
根据上下文,您有更多方法传递向量: -
1)通过引用传递: - 这将使函数foo改变向量的内容.比传递值更有效,因为避免了向量的复制.
2)通过const-reference: - 当你不希望函数改变向量的内容时,这是有效的和可靠的.
| 归档时间: |
|
| 查看次数: |
112374 次 |
| 最近记录: |