c++ - 为什么我的代码中 get<>() 分配的值会在构造之外发生变化?

标签 c++ c++11 tuples 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更改值,但我认为我们不能使用 *iget .

最佳答案

因为当你这样做时:

for (auto i: a)

您正在为 a 中的每个元素制作拷贝。您正在按值迭代并修改容器元素的本地拷贝。如果你想真正修改容器的元素,你必须通过引用迭代:

for (auto& i : a)
        ^^^

auto 不推导出引用。

关于c++ - 为什么我的代码中 get<>() 分配的值会在构造之外发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32850310/

相关文章:

c++ - 将字符串计算为 C++ 中的表达式

c++ - vector 从一种类型到另一种类型的隐式转换 C++

c++ - 将 fork() 与 boost::asio::ip::tcp::iostream 一起使用是否安全?

python - 遍历包含元组的字典

c++ - AMQP-CPP - 基于事件的方法

c++ - 仅重新初始化派生类中的所有成员变量

python - 如何从数据框 Pandas 制作列表列表?

python - Python 中的 "named tuples"是什么?

C++ 运算符重载和继承

c++ - std::array 可以别名更大数组的片段吗?