【问题标题】:How do I create an Iterator class to iterate over a 2d array pointer?如何创建一个迭代器类来迭代二维数组指针?
【发布时间】:2021-12-06 20:15:37
【问题描述】:

我正在尝试在 C++ 中为一个具有 8x8 大小的二维数组作为其主要数据成员的类构建一个迭代器类。我想逐列迭代二维数组。

我试图从向量迭代器类的编写方式来考虑这一点。

我应该如何创建这个 Iterator 类? 构造函数是否需要接受双指针 (**obj) ?假设我这样做了,我将如何在为双指针重载 ++ 运算符时执行增量?

这就是我所拥有的

class Iterator
{
public:
    Iterator(Board **obj)
    {
        ptr = obj;
    }
    Iterator& operator++()
    {
        ptr++;
    }

private:
    Board **ptr;
};

【问题讨论】:

  • 像地狱一样作弊。 C++ 非常支持行优先顺序,因此如果要以列优先顺序主要访问数据,请将数据旋转 90 度,以便交换行和列,并提供一个索引运算符,以用户预期的顺序呈现数据他们很少需要用正确的坐标来显示它。

标签: c++ arrays pointers iterator


【解决方案1】:

首先,您给定的实现不正确。当您增加指针时,您将其增加一个板,而不是板上的一个位置。这根本不是你想要的。

如果您要正确实现迭代器,则需要从包含类开始——假设您实际上是在谈论迭代器,因此您可以执行以下操作:

for (int i: myBoard) { }

编译器知道该怎么做。

class Board {
public:
    class ForwardIterator { ... };
    class ReverseIterator { ... };

    ForwardIterator begin() { ... }
    ForwardIterator end() { ... }.   // Should return one position past the end
    ReverseIterator rbegin() { ... }
    ReverseIterator rend() { ... }.  // One position before beginning

};

这只是一个开始。您还需要 const 版本。您可能可以使用模板来清理它,但您会开始看到 - 这并不一定是微不足道的。

在底层,迭代器可以按照您希望的方式工作。例如,您可以保留int row, col,然后相应地移动它们。以最简单的形式,这就是我要做的。

您还需要 operator= 和 operator!= 以便您可以比较迭代器以检测过去开始或过去结束。

别忘了也实现:

int & operator*() { return board[row][col]; }

正确完成的完整答案超出了 Stack Overflow 的范围。这不是一个坏链接:https://internalpointers.com/post/writing-custom-iterators-modern-cpp。但是对于“编写迭代器 c++”的 google 将产生各种有用的链接,以了解细节。

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 2011-11-14
    • 2014-03-26
    • 2012-11-06
    • 2012-10-04
    • 2018-05-20
    • 2021-10-15
    • 2016-07-24
    • 2021-08-11
    相关资源
    最近更新 更多