【问题标题】:Foreach loops and arrow/dot operator difference?Foreach 循环和箭头/点运算符的区别?
【发布时间】:2019-08-06 02:06:39
【问题描述】:

我有一个类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; }
};

这些存储在名为listPointslist<Point> 中。我有一个函数可以检查某个位置是否与列表中的任何点匹配:

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;
}

这个函数与之前的函数有何不同,特别是为什么. 不再起作用而我需要使用-&gt; 来访问Point 的成员方法?这些 foreach 循环有根本不同吗?

【问题讨论】:

    标签: c++ for-loop foreach iterator


    【解决方案1】:

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

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

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

    具体为什么。不再工作,我需要使用 -> 来访问 Point 的成员方法?

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

    【讨论】:

    • 有趣。我经常将代码传输到服务器并在那里执行它,for (x : y) foreach 循环不起作用,我需要使用其他方式。我只是不确定为什么它们可能会有所不同。谢谢!
    • 您编译它的服务器可能不支持 C++11(引入了范围循环),在这种情况下您可以使用 for 索引或迭代器
    【解决方案2】:

    这些 foreach 循环有根本不同吗?

    它们在本质上并没有什么不同。它们有细微的不同。

    类似于:

    int a;
    int* ptr = &a;
    
    a = 10;
    *ptr = 10;
    

    最后两行在根本上没有什么不同。迭代器有点像指针。它的operator* 被重载,因此使用*p 就像您取消引用一个指针一样——您获得对容器中项目的引用。

    第二个代码块可以稍微修改一下,使其与第一个相似。

    list<Point>::iterator iter = listPoints.begin();
    for (; iter != listPoints.end(); ++iter) {
        Point& p = *iter;
        if (p.getX() == x && p.getY() == y) {
            return true;
        }
    }
    

    在幕后,第一块正是如此。

    详情请参阅documentation on the range-for loop in the standard

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2021-11-01
      • 2021-11-08
      • 2021-12-05
      相关资源
      最近更新 更多