是在C++中通过值或引用传递给函数的向量
Are vectors passed to functions by value or by reference in C++
我正在用C++进行编码。如果我有一些函数void foo(vector<int> test)
,并且我在程序中调用它,向量会通过值还是引用传递?我不确定,因为我知道向量和数组是相似的,而且像void bar(int test[])
这样的函数会通过引用(指针?)而不是通过值来通过测试。我的猜测是,如果我想避免按值传递,但我不确定,我需要显式地通过指针/引用传递向量。
在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)
),但除非你知道自己在做什么,并且你觉得这真的是一条路,否则不要这样做。
此外,向量是而不是与数组相同!在内部,向量跟踪它为您处理内存管理的数组,但许多其他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);
}
vector
在功能上与数组相同。但是,对语言来说,vector
是一种类型,int
也是一种类型。对于函数参数,任何类型的数组(包括vector[]
)都被视为指针。vector<int>
与int[]
(对编译器而言)不同。vector<int>
是非数组、非引用和非指针-它是通过值传递的,因此它将调用复制构造函数。
所以,必须使用vector<int>&
(最好和const
一起使用,若函数并没有对其进行修改的话)将其作为引用传递。
void foo(vector<int> test)
向量将通过中的值传递。
根据上下文,您有更多的方法来传递矢量:-
1) 通过引用传递:-这将使函数foo更改向量的内容。由于避免了矢量的复制,因此比传递值更有效率。
2) 传递常量引用:-当您不希望函数更改向量的内容时,这既有效又可靠。
当我们在函数中逐值传递vector作为参数时,它只会创建vector的副本,当我们调用该特定函数时,不会对主函数中定义的vector产生任何影响。而当我们通过引用向量时,无论在那个特定函数中写什么,当我们调用这个特定函数时,每个动作都将在main或其他函数中定义的向量上执行。
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用向量的template_back函数
- 如何通过派生类函数更改基类中的向量
- 变量没有改变?通过向量的函数调用
- 一对向量构造函数:初始值设定项列表与显式构造
- 在c++中使用向量时,如何调用构造函数和析构函数
- std::sort()函数无法对向量的一部分进行排序
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- C++中函数的向量返回类型引发错误
- 添加存储在向量中的大整数的函数出现问题
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 具有 lambda 函数的函数向量
- 你能用参数制作函数向量吗?
- 在C++中使用成员函数向量时,有没有办法实现协变返回类型
- 在编写 lambda 函数向量时出现隔离错误
- 如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
- 是否将std矢量重新分配到默认的构造函数向量是擦除的好方法
- 运行提升for_each中的成员函数向量
- 创建和回推函数向量
- C++,指向函数向量的指针的STL映射