如何创建C++ Iterator类实现8x8二维数组的按列遍历?
1 迭代器类的设计与构造函数参数选择
你当前设计用Board**作为内部指针的方案存在兼容性问题:如果你的宿主类内的8x8数组是栈上分配的Board data[8][8],其类型本质是连续存储的一维数组,和二级指针Board**并不兼容,强行转二级指针传入会导致访问非法地址。
- 更合理的迭代器内部成员不需要用二级指针,只需保存:指向二维数组首元素的
Board*一级指针、当前遍历位置的行号、列号三个成员即可,构造函数只需要接收这三个值的初始化参数就行。 - 宿主类实现
begin()方法时,直接传二维数组首地址&data[0][0]、起始列0、起始行0即可构造起始迭代器;end()方法传首地址、列8、行0构造终止迭代器即可。
2 按列遍历的++运算符重载实现
按列遍历的逻辑为:先遍历完当前列的所有8行,再跳转到下一列的第0行。用下标记录的方式实现逻辑最清晰,修正后的完整实现代码如下:
class Iterator { public: Iterator(Board* data_ptr, int init_col, int init_row) : data(data_ptr), col(init_col), row(init_row) {} // 前置++重载,实现列优先递增 Iterator& operator++() { row++; // 当前列遍历完,跳转下一列首行 if (row >= 8) { row = 0; col++; } return *this; } // 解引用重载 Board& operator*() { // 行优先存储的二维数组,列优先寻址公式:列号*每行元素数 + 行号 return *(data + col * 8 + row); } // 迭代器判等重载 bool operator!=(const Iterator& other) const { return col != other.col || row != other.row; } private: Board* data; int col; int row; };
如果你一定要沿用二级指针的方案,需要注意二级指针ptr++只会移动一个指针大小的步长,默认指向相邻的下一个Board*元素,无法直接实现列优先的遍历逻辑,需要手动计算偏移,维护成本远高于下标方案,不推荐使用。
内容的提问来源于stack exchange,提问作者Avi Bhatnagar
相关产品推荐
相关产品推荐

