为什么语句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
1}}。
答案 0 :(得分:2)
是的,您的怀疑是正确的,for (auto i: a)
i
包含元组的副本。任何更改都只会影响副本。
您可以使用for (auto& i: a)
进行影响“原始”元组的更改。
答案 1 :(得分:2)
因为当你这样做时:
for (auto i: a)
您正在制作a
中每个元素的副本。您将按值进行迭代并修改容器元素的本地副本。如果要实际修改容器的元素,则必须按引用进行迭代:
for (auto& i : a)
^^^
auto
不会推断参考。