我有一个Point
类,该类具有一个获取位置的成员方法:
class Point {
private:
int x; int y;
public:
Point(int a, int b) {
x = a; y = b;
}
int getX() { return x; }
int getY() { return y; }
};
这些存储在名为
list<Point>
的listPoints
中。我有一个检查位置是否匹配列表中任何点的函数:bool checkMatch(int x, int y) {
for (Point p : listPoints) {
if (p.getX() == x && p.getY() == y) {
return true;
}
}
return false;
}
请注意,
.
用于访问Point
的成员方法,但是还有另一种方法:bool checkMatch(int x, int y) {
list<Point>::iterator p = listPoints.begin();
for (; p != listPoints.end(); ++p) {
if (p->getX() == x && p->getY() == y) {
return true;
}
}
return false;
}
此功能与以前的功能有何不同,特别是为什么
.
不再起作用,我需要使用->
来访问Point
的成员方法?这些foreach循环是否根本不同? 最佳答案
它们没有什么不同,不,有一些非常小的例外。在第二个循环中,您使用的是迭代器,它或多或少是指向对象本身的指针。可以取消引用以获取实际对象。
如果要删除某些元素,则可以使用迭代器。因此,您要删除迭代器而不是检查匹配项,而是要迭代器。
由于您只是在整个范围内进行迭代,因此使用for-ranged循环更为清晰。编写起来更加容易和清晰。
具体为什么。不再工作,我需要使用->来访问Point的成员方法?
因为iterator
是一个对象,所以基本上指向实际对象。您不能覆盖点运算符,因此将替代operator->
来检索对象。也可以像iterator
一样取消引用*p
,这允许您使用点运算符(*p).getX()
关于c++ - Foreach循环和箭头/点运算符的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55175057/