#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假定向量中每个值都有一个副本”时,这是什么意思?
这里是屏幕截图中输出的代码Code Output第一个输出是&第二个输出不带&
输出保持不变
如果删除引用(&
),则仅传递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
内的值(不是副本,而是按值发生的值)。
因此任何修改都会反映在原始元素上。
我认为您需要更改向量的元素(将它们递增1),因此,如果按值传递向量元素,则循环将使用向量元素的副本,而不是元素本身。
因此,您必须使用对矢量元素的引用。
您可以通过使用注释中的提示来确保这一点。
重点是通过参考和按值处理向量的值。下面是不同类型的值的处理:https://en.cppreference.com/w/cpp/language/range-for
当物品价值被价值抓住时:
((auto x:arr)然后创建了多余的副本,然后在for循环中使用它。
当值被引用捕获时:
((auto&x:arr)不生成副本,而是获取矢量项地址,并且该值在for循环中使用。因此,在这种情况下,实际的矢量项目/元素将发生更改。