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

如何利用代理Row类实现Matrix类的[][]常量双索引?

通过Row代理类实现矩阵双索引的示例

嘿,我来给你展示这个用代理Row类实现[][]形式常量双索引的Matrix类,底层用std::valarray来管理数据,代码和关键逻辑都整理好了:

#include <valarray>
#include <iostream>

template <typename T>
class Matrix {
private:
    // 存储矩阵的基本信息和数据
    int nRows_;
    int nColumns_;
    std::valarray<T> data_;

public:
    // 构造函数:初始化矩阵行数、列数,以及对应大小的存储容器
    Matrix(const int nRows, const int nColumns)
        : nRows_{nRows}, nColumns_{nColumns}, data_{std::valarray<T>(nRows*nColumns)} {}

    // 用于实现双索引的友元Row代理类(补全完整实现)
    class Row {
    private:
        const Matrix& parentMatrix_; // 指向所属的Matrix对象
        int rowIndex_;               // 当前代理的行索引
    public:
        // Row构造函数:绑定父矩阵和行索引
        Row(const Matrix& parent, int rowIdx) : parentMatrix_(parent), rowIndex_(rowIdx) {}

        // 重载[]运算符,实现列访问,返回对应位置的常量引用
        const T& operator[](int colIdx) const {
            // 计算valarray中的线性索引:行号*列数 + 列号
            return parentMatrix_.data_[rowIndex_ * parentMatrix_.nColumns_ + colIdx];
        }
    };

    // 重载Matrix的[]运算符,返回对应行的Row代理对象
    Row operator[](int rowIdx) const {
        return Row(*this, rowIdx);
    }
};

// 简单的测试代码
int main() {
    // 创建一个3x3的int类型矩阵
    Matrix<int> myMat(3, 3);
    
    // 这里可以补充赋值逻辑(比如添加非const版本的operator[]),现在先演示常量访问
    // 假设我们已经填充了数据,就可以这样访问:
    // std::cout << myMat[1][2] << std::endl;
    
    return 0;
}

核心逻辑说明:

  • 用std::valarray作为底层存储,相比二维数组更灵活,支持批量操作
  • 双索引的实现依赖代理模式:第一次调用mat[row]会返回一个Row代理对象,第二次调用row[col]才会真正定位到矩阵中的元素
  • 当前实现的是常量访问,如果需要支持修改矩阵元素,可以添加非const版本的operator[]以及Row类的非const重载

内容的提问来源于stack exchange,提问作者Watw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:37:36