按值传递变量与按引用传递变量具有相同的结果
Passing variable by value has the same result as passing it by reference
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> arr {12,13,14,15,16};
for (auto & x: arr)
{
++x;
cout << x << " ";
}
return 0;
}
VS
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> arr {12,13,14,15,16};
for (auto x: arr)
{
++x;
cout << x << " ";
}
return 0;
}
输出保持不变,向量中的每个值都递增 1。但是我的教科书是这么说的。
Text Book Image
当我的教科书说 "x assumes a copy of each value in the vector" 时,那是什么意思?
这是屏幕截图中的代码输出
Code Output
第一个输出是 &
没有 &
的第二个输出
我认为您需要更改向量的元素(将它们加一),因此如果您按值传递向量元素,循环将使用向量元素的副本而不是元素本身。
因此您必须使用对矢量元素的引用。
您可以使用评论中的提示来确保这一点。
The output remains the same
如果您删除引用 (&
),您只会传递 x
的值而不是 x
本身,因此如果您有更改 x
的代码您需要像在第一个示例中那样通过引用传递它的任何方式,否则您只是更改局部变量,而不是原始变量。
打印的值是相同的,因为在第一个示例中您正在递增变量并打印它,在第二个示例中您正在打印局部变量( 只是一个副本)但也在递增。
因此,如果您再次打印矢量,您会发现没有引用的版本并没有改变它。如您所见HERE
你的例子不是理解底层行为的最佳例子,尝试类似的东西:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void reference()
{
cout << "reference" << endl;
vector <int> arr {12,13,14,15,16};
for (auto& x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
void value()
{
cout << "value" << endl;
vector <int> arr {12,13,14,15,16};
for (auto x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
int main()
{
value();
reference();
return 0;
}
现在输出将是:
value
12
13
14
15
16
reference
13
14
15
16
17
如您所见,在参考案例中,向量中的值被直接修改,这是因为您通过使用引用在 vector
上循环,因此 x
局部于循环是对 vector
中实际值的引用(而不是副本,这是按值发生的)。
所以任何修改都会反映在原始元素上。
重点是通过引用和值来处理向量的值。
以下是处理值的不同类型:
https://en.cppreference.com/w/cpp/language/range-for
当它的项目价值按价值捕获时:
(auto x: arr) 然后创建额外的副本,然后我们在 for 循环中使用它。
当它的值被引用捕获时:
(auto &x: arr) 不生成副本,而是获取矢量项地址并将该值用于 for 循环。因此,实际向量 items/elements 在这种情况下发生了变化。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> arr {12,13,14,15,16};
for (auto & x: arr)
{
++x;
cout << x << " ";
}
return 0;
}
VS
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> arr {12,13,14,15,16};
for (auto x: arr)
{
++x;
cout << x << " ";
}
return 0;
}
输出保持不变,向量中的每个值都递增 1。但是我的教科书是这么说的。 Text Book Image 当我的教科书说 "x assumes a copy of each value in the vector" 时,那是什么意思?
这是屏幕截图中的代码输出 Code Output 第一个输出是 & 没有 &
的第二个输出我认为您需要更改向量的元素(将它们加一),因此如果您按值传递向量元素,循环将使用向量元素的副本而不是元素本身。
因此您必须使用对矢量元素的引用。
您可以使用评论中的提示来确保这一点。
The output remains the same
如果您删除引用 (&
),您只会传递 x
的值而不是 x
本身,因此如果您有更改 x
的代码您需要像在第一个示例中那样通过引用传递它的任何方式,否则您只是更改局部变量,而不是原始变量。
打印的值是相同的,因为在第一个示例中您正在递增变量并打印它,在第二个示例中您正在打印局部变量( 只是一个副本)但也在递增。
因此,如果您再次打印矢量,您会发现没有引用的版本并没有改变它。如您所见HERE
你的例子不是理解底层行为的最佳例子,尝试类似的东西:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void reference()
{
cout << "reference" << endl;
vector <int> arr {12,13,14,15,16};
for (auto& x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
void value()
{
cout << "value" << endl;
vector <int> arr {12,13,14,15,16};
for (auto x: arr)
++x;
for (const auto& x : arr)
cout << x << endl;
}
int main()
{
value();
reference();
return 0;
}
现在输出将是:
value
12
13
14
15
16
reference
13
14
15
16
17
如您所见,在参考案例中,向量中的值被直接修改,这是因为您通过使用引用在 vector
上循环,因此 x
局部于循环是对 vector
中实际值的引用(而不是副本,这是按值发生的)。
所以任何修改都会反映在原始元素上。
重点是通过引用和值来处理向量的值。 以下是处理值的不同类型: https://en.cppreference.com/w/cpp/language/range-for
当它的项目价值按价值捕获时:
(auto x: arr) 然后创建额外的副本,然后我们在 for 循环中使用它。
当它的值被引用捕获时:
(auto &x: arr) 不生成副本,而是获取矢量项地址并将该值用于 for 循环。因此,实际向量 items/elements 在这种情况下发生了变化。