You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:45:02