2015-11-18 67 views
0

什么是c++11范围内环路也导致此:关于C++ 11范围内循环和迭代

std::list<Point> item; 
.... 
//fill the list somewhere else 
.... 
for(Point p : item) { 
    p.lowerY(); 
} 

若要仅一次(即lowerY()做什么它应该只有一次这样做,但下一次达到这个循环时,它什么都不做),但是这个:

list<Point>::iterator it; 
for (it = item.begin();it != item.end();++it) { 
    it->lowerY(); 
} 

每次都很完美。有什么不同?

+2

我想..这是因为你得到'按值p'(所以..如果'lowerY'应该改变原始点上的东西..它不会影响原来的)。尝试使用'Point&p'。 – wendelbsilva

+0

是的,修复它,我看到了,所以它制作了原件的副本并改变了它。 @wendelbsilva – shinzou

回答

1

在你以前的代码中,行

for(Point p : item) { 

创建点的副本,每一次进入下一个项目的时间。为了确保你的方法LOWERY的调用()的作品,你需要重新定义它作为

for(Point & p : item) { 
+1

作为进一步的说明,你可能会遇到与for(auto p:item){...}相同的问题,因为这可以用作for(Point p:item){}',所以你会想用'for(auto&p:item){...}'代替。 –