std::pair异常行为问询:仅一行差异的两段C++代码输出结果不同
两段代码输出差异的核心原因
核心差异是修改的对象是vector中存储的原始pair,还是范围for循环生成的临时拷贝副本。
前置知识:范围for循环中auto p:pairs的含义
你写的for (auto p:pairs)逻辑是,每次遍历pairs时,都会把容器内的对应元素值拷贝一份到临时变量p中,p和pairs里存储的原始元素是完全独立的两个对象,修改p不会影响pairs里的原始值。
第一段代码输出12345的原因
第一段修改的是pairs[0].second,直接修改的是vector里存储的原始pair的second字段:
- 外层
v的循环共执行5次,每次进入内层循环时,p都是当前pairs[0]的拷贝值 - 第一次循环:
p拷贝的初始值是1,先把pairs[0].second加1变成2,输出p的拷贝值1 - 第二次循环:
p拷贝的当前pairs[0]值是2,再把原始值加1变成3,输出拷贝值2 - 以此类推,5次输出依次是1、2、3、4、5,拼接结果就是
12345
第二段代码输出22222的原因
第二段修改的是临时拷贝变量p的second字段,完全不会影响pairs里的原始值:
- 每次外层循环进入内层时,
p拷贝的pairs[0]初始值永远是1(原始值从来没有被修改过) - 每次执行
p.second++都会把临时变量p的second从1改成2,然后输出2 - 循环结束后临时变量
p销毁,pairs里的原始值始终保持为1,所以5次输出都是2,拼接结果就是22222
如果你想通过遍历变量修改容器内的原始元素,把循环语句改成
for (auto& p:pairs)即可,加&声明为引用就不会做值拷贝了。
内容的提问来源于stack exchange,提问作者ka1mar
相关产品推荐
相关产品推荐

