C++修改vector元素时为何普通for循环有效而范围for循环无效
问题原因
你编写的范围for循环中,迭代变量Patron x采用的是值拷贝的声明方式:每次循环都会将vector中对应的元素完整复制一份生成临时对象x,后续你调用x.set_fee(fee)修改的仅仅是这个临时拷贝对象的属性,完全不会影响vector内存储的原对象。循环结束后临时对象x就会被销毁,自然看不到修改效果。
而你写的下标版本for循环中,patrons[i]直接指向vector内存储的原对象的引用,修改操作直接作用在原对象上,所以可以正常生效。
修复方法
只需要将范围for循环的迭代变量声明为引用类型即可:
void set_fee(Patron p, int fee) { // 迭代变量加&声明为引用,直接指向vector内的原元素 for (Patron& x : patrons) { if (p.get_name() == x.get_name()) x.set_fee(fee); } }
如果你后续只需要读取元素属性不需要修改,还可以声明为const Patron&减少不必要的拷贝同时避免意外修改。
内容的提问来源于stack exchange,提问作者yaelreshet11
相关产品推荐
相关产品推荐

