现在的位置: 首页 > 综合 > 正文

C++模板类示例

2019年08月12日 ⁄ 综合 ⁄ 共 2659字 ⁄ 字号 评论关闭

记录下一道简单题目的实现:将一个二维矩阵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]$

 

 

抱歉!评论已关闭.