将向量传递给C ++中的函数
传递参数通常可以分为两种类型:
传递值
通过参考
在C++的任何函数中将向量作为参数传递的情况下,情况没有什么不同。我们可以通过值或引用来传递向量。
在下一节中,我们将讨论何时应该使用哪种传递方式以及它们之间的区别。
1)通过值传递向量
下面是通过值传递向量的示例。在下面的示例中,我们试图弄清楚,如果按值传递向量,则函数中的局部更改是否会反映main中的原始向量。
首先让我们看一下示例,然后我们将详细说明发生了什么以及为什么。
#include <bits/stdc++.h> using namespace std; void print(vector<int> arr) { //重视值 //打印已通过的矢量 cout << "In the print function...\n"; cout << "Printing the array that has been passed by value\n"; for (auto i : arr) cout << i << " "; cout << endl; cout << "changes made in array...\n"; for (int i = 0; i < arr.size(); i++) arr[i] = i + arr[i]; cout << "printing after making the changes\n"; for (auto i : arr) cout << i << " "; cout << endl; } int main(){ //使用大小5和元素1初始化向量 vector<int> a(5, 1); //要打印,我们将使用功能 print(a); //再次在这里打印以检查 //打印中的更改是否为 //是否在这里反映 cout << "printing in main\n"; for (auto it : a) { cout << it << " "; } cout << endl; cout << "change not reflected\n"; return 0; }
输出:
In the print function... Printing the array that has been passed by value 1 1 1 1 1 changes made in array... printing after making the changes 1 2 3 4 5 printing in main 1 1 1 1 1 change not reflected
因此,我们发现我们在打印功能中所做的更改未反映在主体中。与按值调用的其他数据类型相似。
当我们按值传递向量时会发生什么?
当我们按值将向量传递给函数时,它仅将向量的深层副本复制到新位置,然后函数对向量的新副本进行操作。这就是为什么所做的更改不会复制回主向量的原因,因为它是深拷贝。
另外,由于它复制矢量,因此很费时间。
什么时候应该传递值?
当我们需要确保对vector参数进行操作的函数进行了更改,但不应干扰原始矢量时,则必须使用按值传递。要详细说明何时需要在函数执行过程中保持原始矢量不变,我们可以按值传递。载体直到最后都保持不变。
2)通过参考传递矢量
下面是通过引用传递矢量的示例。在下面的示例中,我们试图弄清楚,如果我们通过引用传递矢量,则函数中的局部更改是否会反射回main中的原始矢量。
首先让我们看一下示例,然后我们将详细说明发生了什么以及为什么。
#include <bits/stdc++.h> using namespace std; void print(vector<int>& arr) { //通过引用传递 //打印已通过的矢量 cout << "In the print function...\n"; cout << "Printing the array that has been passed by reference\n"; for (auto i : arr) cout << i << " "; cout << endl; cout << "changes made in array...\n"; for (int i = 0; i < arr.size(); i++) arr[i] = i + arr[i]; cout << "printing after making the changes\n"; for (auto i : arr) cout << i << " "; cout << endl; } int main(){ //使用大小5和元素1初始化向量 vector<int> a(5, 1); //要打印,我们将使用功能 print(a); //再次在这里打印以检查 //打印中的更改是否为 //是否在这里反映 cout << "printing in main\n"; for (auto it : a) { cout << it << " "; } cout << endl; cout << "change is reflected\n"; return 0; }
输出:
In the print function... Printing the array that has been passed by reference 1 1 1 1 1 changes made in array... printing after making the changes 1 2 3 4 5 printing in main 1 2 3 4 5 change is reflected
因此,我们发现在打印功能中所做的更改反映在主体中。通过引用进行调用与其他数据类型相似。
当我们通过参考传递矢量时会发生什么?
当我们通过引用将向量传递给函数时,它不会产生向量的任何新副本,而是函数在相同的向量,相同的内存位置上运行。
那就是通过参考的意思。这只是意味着传递了相同的副本。这就是为什么在printf函数中所做的更改会反映回主向量的原因。
另外,由于它不会产生任何新副本,因此速度更快。
什么时候应该通过引用?
当我们需要通过函数修改矢量时,必须通过引用传递矢量。否则,将不会反映在函数中所做的更改。
下面是有关何时应该按值传递向量以及何时应按引用传递向量的详细用例。
向量需要通过函数进行修改:通过引用传递
向量无法通过函数进行修改,但是函数中存在一些修改操作:按值传递
函数不做任何修改:按值传递或按引用传递。但是通过引用传递是一个更好的选择,因为它更快。