是在C+中通过值或引用传递给函数的向量+; 我用C++编写代码。如果我有一些函数void foo(vector test),并且我在程序中调用它,那么向量会通过值或引用传递吗?我不确定,因为我知道向量和数组是相似的,而且像voidbar(int test[])这样的函数将通过引用(指针?)而不是通过值进行测试。我的猜测是,如果我想避免通过值传递,我需要显式地通过指针/引用传递向量,但我不确定。

是在C+中通过值或引用传递给函数的向量+; 我用C++编写代码。如果我有一些函数void foo(vector test),并且我在程序中调用它,那么向量会通过值或引用传递吗?我不确定,因为我知道向量和数组是相似的,而且像voidbar(int test[])这样的函数将通过引用(指针?)而不是通过值进行测试。我的猜测是,如果我想避免通过值传递,我需要显式地通过指针/引用传递向量,但我不确定。,c++,arrays,vector,C++,Arrays,Vector,void foo(向量测试) 该向量将通过该函数中的值进行传递 根据上下文,您有更多的方法传递向量:- 1) 通过引用传递:-这将允许函数foo更改向量的内容。由于避免了向量的复制,因此比传递值更有效 2) Pass by const reference:-当您不希望函数更改向量的内容时,这是有效且可靠的。A向量在功能上与数组相同。但是,对于语言来说,vector是一种类型,int也是一种类型。对于函数参数,任何类型的数组(包括vector[])都被视为指针。向量与int[](对于编译器)不同v

void foo(向量测试)

该向量将通过该函数中的值进行传递

根据上下文,您有更多的方法传递向量:-

1) 通过引用传递:-这将允许函数foo更改向量的内容。由于避免了向量的复制,因此比传递值更有效


2) Pass by const reference:-当您不希望函数更改向量的内容时,这是有效且可靠的。

A
向量
在功能上与数组相同。但是,对于语言来说,
vector
是一种类型,
int
也是一种类型。对于函数参数,任何类型的数组(包括
vector[]
)都被视为指针。
向量
int[]
(对于编译器)不同
vector
是非数组、非引用和非指针的-它是通过值传递的,因此它将调用复制构造函数


>,您必须使用<代码> vector和<代码>(最好是<代码> const <代码>,如果函数不修改它)作为引用传递。

C++,除非您指定使用<代码>和/代码>运算符,否则所有的东西都是按值传递的(注意,这个运算符也被用作运算符的地址,但在不同的上下文中使用)。这些都有很好的文档记录,但我还是要重复:

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(向量条);//按价值
void foo(矢量和条形);//通过引用(非常量,因此可在foo中修改)
void foo(向量常量和条形);//常量引用
您也可以选择传递指向向量的指针(
void foo(vector*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);
}

void foo1(int*arr){cout当我们在函数中按值传递向量作为参数时,它只创建向量的副本,并且在调用该特定函数时,不会对主函数中定义的向量产生任何影响。
而当我们通过引用传递向量时,不管在那个特定函数中写了什么,

当我们调用特定函数时,每个操作都将在main或其他函数中定义的向量上执行。

C++具有“传递值”语义,因此它是按值传递的。不过,您可以决定按引用传递。选择实际上取决于函数的功能。按引用使用,如果您不希望函数更改向量内容,请将其设置为常量,否则只需按引用传递。这将避免不想要的和昂贵的(有时)copy同样,引用不是指针。@AliKazmi除非你想在函数体中得到一个副本。这取决于你想实现什么。使用一个标准的智能指针有时很有用,例如,如果你想传递所有权,那么就使用unique_ptr。但是通常,我通过引用传递std::vector。有人能帮我理解吗最后一个声明foo4函数?为什么它像其他函数一样返回数组的大小而不是指针的大小?@abhishek\u M,因为参数类型是引用。引用只能绑定到完全相同类型的表达式。因此,数组不会衰减,因为数组的引用不能绑定到指针,它只能绑定到同一类型的数组(在本例中为10个整数的数组)c++11具有“移动语义”,您可以小心地执行此操作,并在不复制的情况下按值传递(使用移动语义)。以下链接对我帮助很大:通过引用函数传递“向量数组”的语法是什么?void functionName(std::vector(&vc)[5]){}