为什么我的代码中 get<>() 分配的值会在构造之外发生变化?
Why does the value assigned by get<>() in my code change outside the construct?
为什么语句 2
的输出与语句 1
的输出不同?
// a is of type vector < tuple <int, int> >
for (auto i: a)
{
get<0>(i)+=get<1>(i);
cout << get<0>(i) << " " << get<1>(i) << endl; // 1
}
for (auto i: a) cout << get<0>(i) << " " << get<1>(i) << endl; // 2
假设最初,a
包含[7, 3] , [9, 1]
然后1
输出
10 3
10 1
而 2
输出
7 3
9 1
简而言之,循环封闭语句1
似乎没有效果。
我觉得和我使用auto
没有使用*i
改变值有关系,但是我觉得我们不能在里面使用*i
get
.
是的,您的怀疑是正确的,在 for (auto i: a)
中 i
包含元组的副本。任何更改仅影响副本。
您可以使用 for (auto& i: a)
进行影响 "original" 元组的更改。
因为当你这样做时:
for (auto i: a)
您正在为 a
中的每个元素制作 副本 。您正在按值迭代并修改容器元素的本地副本。如果你想真正修改容器的元素,你必须通过引用迭代:
for (auto& i : a)
^^^
auto
不推导引用。
为什么语句 2
的输出与语句 1
的输出不同?
// a is of type vector < tuple <int, int> >
for (auto i: a)
{
get<0>(i)+=get<1>(i);
cout << get<0>(i) << " " << get<1>(i) << endl; // 1
}
for (auto i: a) cout << get<0>(i) << " " << get<1>(i) << endl; // 2
假设最初,a
包含[7, 3] , [9, 1]
然后1
输出
10 3
10 1
而 2
输出
7 3
9 1
简而言之,循环封闭语句1
似乎没有效果。
我觉得和我使用auto
没有使用*i
改变值有关系,但是我觉得我们不能在里面使用*i
get
.
是的,您的怀疑是正确的,在 for (auto i: a)
中 i
包含元组的副本。任何更改仅影响副本。
您可以使用 for (auto& i: a)
进行影响 "original" 元组的更改。
因为当你这样做时:
for (auto i: a)
您正在为 a
中的每个元素制作 副本 。您正在按值迭代并修改容器元素的本地副本。如果你想真正修改容器的元素,你必须通过引用迭代:
for (auto& i : a)
^^^
auto
不推导引用。