如何利用代理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
相关产品推荐
相关产品推荐

