c++ - Foreach 循环和箭头/点运算符的区别?

标签 c++ for-loop foreach iterator

我有一个类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 循环有根本的不同吗?

最佳答案

它们并没有什么不同,除了一些非常小的异常(exception)。在第二个循环中,您使用了一个迭代器,它或多或少是一个指向对象本身的指针。它可以被取消引用以获取实际对象。

如果你想删除一些元素,你会使用迭代器。所以说不是检查匹配项,而是删除任何匹配项,您希望使用迭代器进行迭代。

由于您只是在整个范围内迭代,因此使用 for-ranged 循环要清楚得多。写起来更容易,也更清晰。

specifically why does . no longer work and I need to use -> instead to access member methods of Point?

因为 iterator 是一个对象,它基本上指向实际的对象。您不能覆盖点运算符,因此 operator-> 被覆盖以检索对象。还可以像 *p 一样取消引用 iterator,它允许您使用点运算符 (*p).getX()

关于c++ - Foreach 循环和箭头/点运算符的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55175057/

相关文章:

c++ - 为结构(或类)行为数组赋值

c++ - dll中的xmlrpc服务器,向自己发送信号?

shell - shell 行为中指定大小的 For 循环

java - 比较 Java 中使用纳米时间的方法速度性能

c++ - 设计迭代器包装器

c++ - C++ 标准工作草案之间的变化?

java - 为什么程序不计算利息?

php - 从php中的一系列数组键中跳过键索引

java - for each 循环的默认空点异常检查器

java - 遍历列表时获取 ConcurrentException