如何创建一个Iterator类来迭代2d数组指针?



我试图在c++中构建一个迭代器类,该类具有大小为8x8的2d数组作为其主要数据成员。我想迭代二维数组列。

我试着从vector迭代器类的编写方式来考虑这个问题。

我应该如何创建这个Iterator类?构造函数需要接受双指针(**obj)吗?假设我这样做了,如何在重载双指针的++操作符时执行增量操作呢?

这是我的

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

首先,你给出的实现是不正确的。当你增加指针时,你是在增加一个Board,而不是在Board中的一个位置。那根本不是你想要的。

如果你要正确地实现迭代器,你需要从包含类开始——假设你实际上在谈论迭代器,你可以这样做:

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

一个完整的答案,正确地完成,超出了堆栈溢出的范围。这个链接不错:https://internalpointers.com/post/writing-custom-iterators-modern-cpp。而是一个"编写迭代器"的google c++;将产生各种有用的链接,以获得基本的细节。

最新更新