C++模板类示例

记录下一道简单题目的实现:将一个二维矩阵A转换为B,B[i][j]的值用A中i行的最大值和j列的最小值的平均值为替换。

解题思路很简单,求一下每行的最大值和每列的最小值,分别存起来。接下来就是求平均数了。

 

为了练习下模板,写了个模板类记录下(主要知识点在代码中有注释)!

开发环境:vc2012和Fedora20

 

模板类定义及实现Matrix.h:

/*
写模板类注意事项:
1. 模板类的声明与定义(实现)必须放在同一文件中, 若分开在实例化时可能会找不到其定义
2. 模板特化可以与声明分开
*/
#ifndef __MATRIX_H__
#define __MATRIX_H__
#include <iostream>
#include <stddef.h>
#include <assert.h>
using namespace std;
// --------------------- 模板类声明 -------------------
template <typename T>
class CMatrix							// 二维矩阵模板类
{
public:
CMatrix(int r = 0, int c = 0)
{
rows = r;
cols = c;
arr = NULL;
if(rows > 0 && cols > 0)
{
arr = new T*[rows];			// 生成指针数组(长度为rows)
assert(arr != NULL);
for(int i = 0; i < rows; i++)
arr[i] = new T[cols];	// 为每个指针分配空间(长度为cols)
}
}
~CMatrix()
{
if(arr)
{
for(int i = 0; i < rows; i++)
{
if(arr[i])
delete arr[i];		// 释放每一行向量
}
delete [] arr;				// 释放指针数组
}
}
T getMaxInRow(int r) const			// 求二维数组r行中的最大值
{
T max = arr[r][0];				// 取行中第一个元素
for(int i = 1; i < cols; i++)
{
if(max < arr[r][i])
max = arr[r][i];
}
return max;
}
T getMinInCol(int c) const			// 求二维数组c列中的最小值
{
T min = arr[0][c];				// 取列中第一个元素
for(int i = 1; i < rows; i++)
{
if(min > arr[i][c])
min = arr[i][c];
}
return min;
}
bool setValue(int i, int j, T v);
void display();
public:
int		rows;
int		cols;
T**		arr;
};
template <typename T>
class CMatrixChanger
{
public:
// 将matIn声明为const后, 将只能访问matIn中的const成员(变量或函数)
static void Convert(const CMatrix<T>& matIn, CMatrix<T>& matOut);
};
// ------------------------ 模板类定义(实现) ----------------
template <typename T>
bool CMatrix<T>::setValue(int i, int j, T v)
{
if(i < rows && j < cols)
{
arr[i][j] = v;
return true;
}
return false;
}
template <typename T>
void CMatrix<T>::display()
{
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
cout << arr[i][j] << '\t';
cout << endl;
}
}
/*
功能:	矩阵转换(规则: 求矩阵A[][]中i行中最大值与j列中最小值的平均值), 将结果存放到matOut.arr[][]
*/
template <typename T>
void CMatrixChanger<T>::Convert(const CMatrix<T>& matIn, CMatrix<T>& matOut)
{
int nr = matIn.rows;
int nc = matIn.cols;
T* r_max = new T[nr];		// 保存每一行的最大值
T* c_min = new T[nc];		// 保存每一列的最小值
int i, j;
for(i = 0; i < nr; i++)
{
r_max[i] = matIn.getMaxInRow(i);
}
for(i = 0; i < nc; i++)
{
c_min[i] = matIn.getMinInCol(i);
}
for(i = 0; i < nr; i++)
{
for(j = 0; j < nc; j++)
{
matOut.arr[i][j] = (r_max[i] + c_min[j]) / 2.0;	// 取所在行最大值与所在列最小值的平均值
}
}
delete [] r_max;
delete [] c_min;
}
#endif


主函数来调用下main.cpp:

#include <stdlib.h>
#include <time.h>
#include "Matrix.h"
#define ROWS 4
#define COLS 5
void test()
{
CMatrix<double> matIn(ROWS, COLS), matOut(ROWS, COLS);
srand((unsigned)time(NULL));		// 初始化随机数种子
for(int i = 0; i < ROWS; i++)		
{
for(int j = 0; j < COLS; j++)
{
double v = rand() % 320;	// 产生一个[0-320)之间的随机整数来初始化二维数组
matIn.setValue(i, j, v);
}
}
matIn.display();
CMatrixChanger<double>::Convert(matIn, matOut);
cout << endl;
matOut.display();
}
int main()
{
test();
return 0;
}


编译及运行(取自Fedora20):

[zcm@matrix #293]$make
g++    -c -o main.o main.cpp
g++ -o main main.o -Wall -Os
[zcm@matrix #294]$./main
228     83      263     173     93
152     73      318     160     23
207     292     259     250     314
241     46      171     72      134
207.5   154.5   217     167.5   143
235     182     244.5   195     170.5
233     180     242.5   193     168.5
196.5   143.5   206     156.5   132
[zcm@matrix #295]$


 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wechat code miniprogram 没有找到可以构建的 NPM 包

首先在小程序根目录打开命令窗口&#xff0c;输入 npm init 创建好package.json文件后输入 npm i bootstrap --production 就ok啦 这里解释下 npm install --production 只安装dependencies而不安装devDependencies。 production 很重要

发布一个http请求封装类

调试时经常要模拟提交&#xff0c;在抓取别人页面时也经常要去请求别人的页面&#xff0c;于是就写了下面这个类。封装了三种post提交方法和一个request请求方法&#xff0c; <?php /** * HTTP常用请求封装 * * Copyright(c) 2012 by ustb80. All rights reserved * …

父盒子高度为子盒子总高度自动撑满 height: fit-content; //设置内容高度

给父盒子设置高度子盒子总高度 属性&#xff1a; height: fit-content; //设置内容高度

转一篇关于并发和并行概念的好文,附带大神评论

转自&#xff1a;https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ 还在疑惑并发和并行&#xff1f; OK&#xff0c;如果你还在为并发&#xff08;concurrency&#xff09;和并行&#xff08;parallesim&#xff09;这两个词的区别而感到困扰&#xff0c;那…

MySQL索引背后的数据结构及算法原理-转

转 http://www.codinglabs.org/html/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;MySQL支持诸多存储引擎&#xff0c;而各种存储引擎对索引的支持也各不相同&#xff0c;因此MySQL…

selenium-webdriver for node 鼠标滑动到指定元素

在做滑动到底部的时候&#xff0c;网上看了别人的资料用不起&#xff0c;后面在selenium官网找到鼠标移动事件才解决&#xff0c;控制滑动到指定位置 代码&#xff1a; let searchBtn driver.findElement(By.id("tb_rich_poster"));const actions driver.actions…

解决uni微信小程序的滚动条显示隐藏;小程序滚动条隐藏;隐藏微信小程序滚动条;

直接在当前页面css下书写即可 不是在某个盒子class下书写 /* 解决小程序和app滚动条的问题 *//* #ifdef MP-WEIXIN || APP-PLUS */::-webkit-scrollbar {display: none;}/* #endif */

第八章 心得体会

通过第八章的学习&#xff0c;了解了蜂鸣器的工作原理以及利用PWM驱动使蜂鸣器发出声音。、 学到的知识&#xff1a; 一、Linux驱动的代码重用 1、编译是由多个文件组成的Linux驱动 如果Linux驱动只有1个源代码文件&#xff0c;0bj-m变量可以和源代码文件同名。如果Linux驱动包…

vue项目通过directives指令实现vue实现盒子的移动;vue拖拽盒子;vue移动;

vue项目&#xff1a;点击拖拽盒子&#xff1b;移动盒子&#xff1b; 代码可直接复制&#xff1a;&#xff08;注意需要在移动的盒子上添加 v-指令 注意采用固定定位&#xff09; <template><div class"far_box"><div>{{ msg }}</div><!-…

JSP邮箱信息截取

// 将前四位的显示替换成“****”&#xff0c;不足四位的全部替换成“****”。 function email() { var str1 "${sessionScope.gameUser.email}"; var str2 str1.split(""); var flag1 str2[0].length; var s…

SuperAgent 中文乱码星号问号问题

看到星号问号了么&#xff0c;SuperAgent 爬取时中文乱码星号&#xff0c;只有中文是乱码&#xff0c;其它都是对的&#xff0c;肯定需要转义&#xff0c;找了两个小时&#xff0c;最后度娘看到个帖子 https://cloud.tencent.com/developer/article/1445392试了试&#xff0c;…

括号匹配(二)

//C v0.01 不知题意&#xff0c;正在理解&#xff0c;正在&#xff08;一&#xff09;上修改。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define STACK_SIZE 10000 typedef struct STACK{ char stack[STACK_SIZE]; int pointer; }STSTA…

linux 下安装mysql

第一&#xff1a;保证服务器下没安装过MYSQL 由于数据库版本不同&#xff0c;5.7与8.0的数据库命令的使用方式也有些差异 本地数据如果用的老版&#xff0c;服务器用的新版&#xff0c;比如datatime这种记录时间的字段会传输报错 开始安装&#xff1a; 下载mysql mysql 官…

制作 Windows8   to Go

制作 Windows to Go 将准备好的 Windows 8 的镜像文件&#xff08;ISO 格式&#xff09;加载到虚拟光驱中去&#xff1b;将准备好的 USB 存储设备插入&#xff1b;打开控制面板&#xff0c;点击“Windows To Go”&#xff1b;在接下来的选项中按照步骤提示选择对应的 Win 8 的镜…

vue监听浏览器刷新和关闭;

注意&#xff1a;区分不了浏览器是触发了刷新还是关闭&#xff0c;而且提示的弹框是无法自定义的&#xff1b;如果有大佬有方法能区分&#xff0c;还请评论学习一下&#xff01;感谢&#xff01; 代码可直接复制&#xff1a; <template><div><div /></di…

Linux 线程(1):线程概述

一、进程与程序的区别 程序是应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中&#xff0c;而进程则是处于动态条件下由操作系统维护的系统资源管理实体&#xff0c;也就是程序的动态执行过程。 二、进程与线程的区别 进程是系统中程序执行和资源分配的基本单位…

【年少的风】C#小学生算式×××2

测试面板对应的代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.OleDb; using System.Data.SqlClient; na…

计算文件的md5;vue计算文件md5值;计算图片的md5值;

github链接 1.先下载 npm i browser-md5-file -S2.在使用的vue页面引入和声明方法 import BMF from browser-md5-file const bmf new BMF()3.使用方法&#xff1a; function handle(e) {const file e.target.files[0];bmf.md5(file,(err, md5) > {console.log(err:, err);…

JS垃圾回收

JS本是一套全自动内存回收程序&#xff0c;当程序有不需要使用的数据时&#xff0c;JS会定期的回收&#xff0c;释放内存。 回收机制&#xff1a;标记回收 JS会自动回收标记为0的数据&#xff1b; 例&#xff1a;var a {}; &#xff08;表示a数据有被引用&#xff0c;数据…

nginx 非socket代理配置

nginx反向代理socket配置 1&#xff0c;安装 git clone https://github.com/yaoweibin/nginx_tcp_proxy_modulecd nginx-1.8.1patch -p1 < /root/to/nginx_tcp_proxy_module/tcp.patch./configure --prefix/usr/local/nginx --with-http_stub_status_module --with-http_per…