当前位置: 首页 > news >正文

第10章 模板与泛型编程 编程题#2:模板类编写

编程题#2:模板类编写

编写模板类Matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int,double, 类complex(包含实数real,虚数virt两部分) 等数据类型测试所写matrix类接口。

template<classT>classsquare_matrix{protected:Tp val[max_size][max_size];intsidelen;// sidelen ≤ 12public:square_matrix(intr,intc);/* … */};

Solution

分析

要求设计一个方阵类型并重载运算符。

根据基础的线性代数知识,一种比较符合大家感性认识的运算符重载设计如下:

  • ++=--=:矩阵加法、矩阵减法,无需多说。
  • **=:可以是矩阵乘法,也可以是矩阵的数乘
  • //=:矩阵除以一个数
  • ^^=:矩阵的幂次
  • ++--:有些人倾向于将“矩阵++/- -”理解为加上或减去单位矩阵,也有人倾向于理解为所有元素加上或减去 1。
  • []:重载下标运算符,直接调取对应位置的元素即可。

代码

#include<iostream>#include<iomanip>usingnamespacestd;template<typenameTp>classsquare_matrix{public:// Construct the matrix by a known side length value(no greater than 12).square_matrix(intlen):sidelen(len){memset(val,0,sizeof(val));}square_matrix(square_matrix<Tp>&another){this->sidelen=another.sidelen;memcpy(this->val,another.val,sizeof(this->val));}square_matrix<Tp>&operator=(square_matrix<Tp>another){this->sidelen=another.sidelen;memcpy(this->val,another.val,sizeof(this->val));return*this;}private:// Maximum size of the matrix.// The calculation rely on recursion so the side length of the matrix cannot be too large.// Calculation will take a very long time to finish if side length is greater than 12.staticconstintmax_size=12;// The matrix and its real side length.Tp val[max_size][max_size];intsidelen;// sidelen ≤ 12private:// Use Laplace's expansion method to calculate determinant.// This function is not allowed to call from outside.Tplaplace_expansion(intr,intc);public:// Modify matrix size.voidmodify_size(intnewlen){sidelen=newlen;}// Modify specific value.voidmodify_value(introw,intcol,Tp value){this->val[row][col]=value;}// Inputvoidinput(void){for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)cin>>val[i][j];}// Get sizeintgetsize(void)const{returnsidelen;}// Get matrixautogetmatrix(void){returnval;}public:// Use subscript operator to get values.Tp*operator[](introw){returnval[row];}public:// Use plus operator to do plus calculation.square_matrix<Tp>&operator+=(square_matrix<Tp>&another){// Two matrixes have the same side length is expected.if(this->sidelen!=another.sidelen)throwinvalid_argument("Two matrixes should have same side length!");elsefor(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)val[i][j]+=another[i][j];return*this;}square_matrix<Tp>operator+(square_matrix<Tp>&another){// Two matrixes have the same side length is expected.if(this->sidelen!=another.sidelen)throwinvalid_argument("Two matrixes should have same side length!");else{square_matrix<Tp>result(this->sidelen);for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)result[i][j]=val[i][j]+another[i][j];returnresult;}}// Use plus operator to do minus calculation.square_matrix<Tp>&operator-=(square_matrix<Tp>&another){// Two matrixes have the same side length is expected.if(this->sidelen!=another.sidelen)throwinvalid_argument("Two matrixes should have same side length!");elsefor(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)val[i][j]-=another[i][j];return*this;}square_matrix<Tp>operator-(square_matrix<Tp>&another){// Two matrixes have the same side length is expected.if(this->sidelen!=another.sidelen)throwinvalid_argument("Two matrixes should have same side length!");else{square_matrix<Tp>result(this->sidelen);for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)result[i][j]=val[i][j]-another[i][j];returnresult;}}// Multiply by a factor.square_matrix<Tp>&operator*=(Tp times)noexcept{for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)val[i][j]*=times;return*this;}square_matrix<Tp>operator*(Tp times)noexcept{square_matrix<Tp>result=*this;for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)result[i][j]*=times;returnresult;}// Divide by a factor.square_matrix<Tp>&operator/=(Tp divisor){if(divisor==0)throwinvalid_argument("Divisor cannot be zero!");elsefor(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)val[i][j]/=divisor;return*this;}square_matrix<Tp>operator/(Tp divisor){if(divisor==0)throwinvalid_argument("Divisor cannot be zero!");else{square_matrix<Tp>result=*this;for(inti=0;i<=sidelen-1;i+=1)for(intj=0;j<=sidelen-1;j+=1)result[i][j]=val[i][j]/divisor;return*this;}}// operator ++ will be used as adding an identity matrix, which is also known as diag(1,1,...,1).square_matrix<Tp>&operator++()noexcept{for(inti=0;i<=sidelen-1;i+=1)val[i][i]+=1;return*this;}// Operator -- will be used as subtracting an identity matrix.square_matrix<Tp>&operator--()noexcept{for(inti=0;i<=sidelen-1;i+=1)val[i][i]-=1;return*this;}// Matrix multiplesquare_matrix<Tp>operator*(square_matrix<Tp>another){square_matrix<Tp>result(this->sidelen);inti,j,k;for(i=0;i<sidelen;i+=1)for(j=0;j<sidelen;j+=1)for(k=0;k<sidelen;k+=1)result[i][j]+=val[i][k]*another[k][j];returnresult;}square_matrix<Tp>operator*=(square_matrix<Tp>another){square_matrix<Tp>temp(this->sidelen);inti,j,k;for(i=0;i<sidelen;i+=1)for(j=0;j<sidelen;j+=1)for(k=0;k<sidelen;k+=1)temp[i][j]+=val[i][k]*another[k][j];*this=temp;return*this;}public:// Use Laplace's expansion method to calculate determinant.Tpdeterminant(Tp _matrix[12][12],intsize);// Calculate adjugate matrix.// Hint: Inverse matrix multiply by determinant value is adjugate matrix.square_matrix<Tp>adjugate(void);public:voidoutput(){intwidth[12]={0};for(inti=0;i<=sidelen-1;i+=1){for(intj=0;j<=sidelen-1;j+=1){if(i==0)printf("\u250c ");elseif(i==sidelen-1)printf("\u2514 ");elseprintf("\u2502 ");for(j=0;j<sidelen;j+=1)cout<<left<<setw(4)<<val[i][j];if(i==0)printf("\u2510 ");elseif(i==sidelen-1)printf("\u2518 ");elseprintf("\u2502 ");cout<<endl;}}}};intmain(){cout<<__FILE__<<endl;cout<<__TIME__<<endl;cout<<__LINE__<<endl;cout<<_MSVC_LANG<<endl;square_matrix<int>A(2);A.input();square_matrix<int>B=A;(A+A).output();(++A).output();(A*10+B).output();(--A).output();A*=4;A.output();A/=2;A.output();A*=A;A.output();}
http://www.jsqmd.com/news/990783/

相关文章:

  • 千万级数据入库ES卡死?全套生产写入优化方案,让你的ES吞吐量翻倍
  • 苏州闲置黄金变现正当时 2026年6月金价及三大优质回收机构解读 - 润富黄金回收
  • 终极指南:5步免费备份微信聊天记录,永久保存珍贵回忆
  • 深度解析AlgerMusicPlayer:基于Electron+Vue3的第三方网易云音乐播放器技术方案与实战指南
  • 2026年6月北京老房装修公司优选指南:专业评测与品牌深度解析 - 品牌推荐
  • Windows系统文件cryptbase.dll丢失找不到问题解决
  • Docker 与 Kubernetes:从“集装箱”到“远洋舰队”
  • RabbitMQ 从零到实战:概念、配置与 Spring Boot 集成指南
  • 港科大EMBA真实体验|科技+商业双驱动,高管深度就读感悟
  • LORE算法:非凸Schatten准范数优化在序数嵌入中的应用
  • Android Kotlin多模块MVI项目脚手架:含协程状态流、Room本地存储、Retrofit网络层与Koin依赖注入
  • ZenlessZoneZero-OneDragon:绝区零自动化辅助工具的技术架构解析与实现原理
  • 掌握 Self-Attention(自注意力)机制——Transformer 与大模型的核心基础
  • 3分钟搞定Windows ADB环境:一键自动化驱动安装解决方案
  • GHelper深度解析:如何通过轻量级架构重新定义华硕笔记本性能管理
  • 郑州国窖回收技术全解析:鉴别、估价与合规交易推荐 - 优质品牌商家
  • 用CH32X035做个“万能钥匙”:手把手教你DIY一个PD/QC快充诱骗器(附源码)
  • 手把手复现:用Python仿真一个简易的RIS相位调控单元(附代码)
  • 2026年6月恒温恒湿箱厂家权威榜单发布:专业实力与真实口碑双重认证 - 品牌推荐
  • Nacos 5问挑战:答不上别说你懂
  • 老java 程序学习ai 第一步-LLM开发,ollama +LLM+Langchain4 开发ai智能客服
  • Zotero Style:重塑文献管理体验的可视化增强神器
  • 终极无损音乐库构建指南:用qobuz-dl轻松获取24位高解析度音频
  • 3分钟掌握:免费使用Cursor Pro功能的完整教程与终极指南
  • Figma中文界面本地化:为什么专业翻译比机器翻译更能提升设计效率?
  • GanttProject深度解析:如何用开源架构实现企业级项目管理
  • MC9S12XE XGATE硬件信号量:嵌入式多核并发编程实战指南
  • ArkTS 严格类型系统:我答错 2 道题后才真正搞懂的几条规则
  • 如何用700欧元预算将随机割草机升级为RTK GPS智能机器人?
  • 如何快速搭建个人付费墙绕过工具:13ft Ladder终极指南