C++模板类示例
記錄下一道簡單題目的實現(xiàn):將一個二維矩陣A轉(zhuǎn)換為B,B[i][j]的值用A中i行的最大值和j列的最小值的平均值為替換。
解題思路很簡單,求一下每行的最大值和每列的最小值,分別存起來。接下來就是求平均數(shù)了。
?
為了練習(xí)下模板,寫了個模板類記錄下(主要知識點在代碼中有注釋)!
開發(fā)環(huán)境:vc2012和Fedora20
?
模板類定義及實現(xiàn)Matrix.h:
/*寫模板類注意事項:1. 模板類的聲明與定義(實現(xiàn))必須放在同一文件中, 若分開在實例化時可能會找不到其定義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]; // 生成指針數(shù)組(長度為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; // 釋放指針數(shù)組}}T getMaxInRow(int r) const // 求二維數(shù)組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 // 求二維數(shù)組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成員(變量或函數(shù))static void Convert(const CMatrix<T>& matIn, CMatrix<T>& matOut); };// ------------------------ 模板類定義(實現(xiàn)) ---------------- 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;} }/*功能: 矩陣轉(zhuǎn)換(規(guī)則: 求矩陣A[][]中i行中最大值與j列中最小值的平均值), 將結(jié)果存放到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
 主函數(shù)來調(diào)用下main.cpp:
 編譯及運行(取自Fedora20):
 ?
?
總結(jié)
 
                            
                        - 上一篇: CString转char的方法总结
- 下一篇: ASIHTTPRequest源码简单分析
