我有一个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/

10-16 08:59