我试图在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++;将产生各种有用的链接,以获得基本的细节。