函数模板与类模板的相关笔记 entry1
函数模板; 类模板;
函数模板定义:
template<class T>
//模板前缀,通知编译器接下来的函数定应负或者函数声明是一个模板,class此处不是类,而是类型(type).T是类型参数,可被任意类型替代(如int,char,double.....)
//因此,函数模板实际是针对不同类型的函数的一个大集合.
Template <类型1 变量1 , 类型2 变量2, ….. > 返回类型 函数名(形参表)
{
函数定义体;
}
编译器根据该函数实参数据类型,生成相应的重载函数,该重载函数称为模板函数,是一个实实在在的函数。
下面看几个例子
函数模板实例
大小比较系统
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T max(T a, T b, T c)
{
if (b > a)
{
a = b;
}
if (c > a)
{
a = c;
}
return a;
}
void main()
{
int i1, i2, i3;
cin >> i1 >> i2 >> i3;
int i = max(i1, i2, i3);
cout << "i_max = " << i << endl;
string g1, g2, g3;
cin >> g1 >> g2 >> g3;
string g = max(g1, g2, g3);
cout << "g_max = " << g << endl;
}
字符串转换系统
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
template<typename T>
T fromString(const string& s)
{
istringstream is(s);
T t;
is >> t;
return t;
}
template<typename T>
string toString(const T& t)
{
ostringstream os;
os << t;
return os.str();
}
void main()
{
int i = 1234;
cout << "i = " << toString(i) << endl;
double x = 34.32;
cout << "x = " << toString(x) << endl;
i = fromString<int>(string("5678"));
cout << "i = " << i << endl;
x = fromString<double>(string("3.1415"));
cout << "x = " << x << endl;
}
矩阵运算
矩阵运算矩阵转置与矩阵相乘
#include <iostream>
#include <iomanip>
using namespace std;
void inverse(int [3][6], int [6][3]);
void multi(int[6][3], int [3][4], int [6][4]);
void output(int [6][4]);
int main()
{
int middle[6][3], result[6][4];
int matrix1[3][6] = {8, 10, 12, 23, 1, 3, 5, 7, 9, 2, 4, 6, 34, 45, 56, 2, 4, 6};
int matrix2[3][4] = {3, 2, 1, 0, -1, -2, 9, 8, 7, 6, 5, 4};
inverse(matrix1, middle);
multi(middle, matrix2, result);
output(result);
return 0;
}
void inverse(int matrix1[3][6], int middle[6][3])
{
int i, j;
for (i = 0; i < 3; i++){
for (j = 0; j < 6; j++){
middle[j][i] = matrix1[i][j];
}
}
}
void multi(int middle[6][3], int matrix2[3][4], int result[6][4])
{
int i, j, k;
for (i = 0; i < 6; i++){
for (j = 0; j < 4; j++){
result[i][j] = 0;
for (k = 0; k < 3; k++){
result[i][j] += middle[i][k]*matrix2[k][j];
}
}
}
}
void output(int result[6][4])
{
int i, j;
cout << "result" << "\n";
for (i = 0; i < 6; i++){
for (j = 0; j < 4; j++){
cout << setw(6) << result[i][j];
}
cout << endl;
}
}
-------------------------------
运算结果:
result
257 210 223 176
338 276 298 236
419 342 373 296
81 54 51 24
27 18 57 48
45 30 87 72
-----------------------------------------
矩阵运算:矩阵转置与矩阵相乘函数模板。下标作为参数传递
#include <iostream>
#include <iomanip>
using namespace std;
template<typename T1, typename T2>
void inverse(T1* mat1, T2* mat2, int a, int b);
template<typename T1, typename T2>
void multi(T1* mat1, T2* mat2, T2* result, int a, int b, int c);
template <typename T>
void output(T* mat, char* s, int a, int b);
int main()
{
int middle[6][3], result[6][4];
int matrix1[3][6] = {8, 10, 12, 23, 1, 3, 5, 7, 9, 2, 4, 6, 34, 45, 56, 2, 4, 6};
int matrix2[3][4] = {3, 2, 1, 0, -1, -2, 9, 8, 7, 6, 5, 4};
char* s1 = "result";
char* s2 = "middle";
inverse(matrix1, middle, 6, 3);
//显式: inverse<int[6], int[3]>(matrix1, middle, 6,3)
multi(middle, matrix2, result, 6, 3, 4);
//显式: multi<int[3], int[4]>(middle, matrix2, result, 6, 3,4);
output(matrix1, "matrix1", 3, 6);
output(middle, s2, 6, 3);
output(matrix2, "matrix2", 3, 4);
output(result, s1, 6, 4);
return 0;
}
template<typename T1, typename T2>
void inverse(T1* mat1, T2* mat2, int a, int b)
{
for (int i = 0; i < b; i++){
for (int j = 0; j < a; j++){
mat2[j][i] = mat1[i][j];
}
}
}
template<typename T1, typename T2>
void multi(T1* mat1, T2* mat2, T2* result, int a, int b, int c)
{
for (int i = 0; i < a; i++){
for (int j = 0; j < c; j++){
result[i][j] = 0;
for (int k = 0; k < b; k++){
result[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
}
template <typename T>
void output(T* mat, char* s, int a, int b)
{
cout << s << endl;
for (int i = 0; i < a; i++){
for (int j = 0; j < b; j++){
cout << setw(6) << mat[i][j];
}
cout << endl;
}
}
------------------------------------------
运算结果:
matrix1
8 10 12 23 1 3
5 7 9 2 4 6
34 45 56 2 4 6
middle
8 5 34
10 7 45
12 9 56
23 2 2
1 4 4
3 6 6
matrix2
3 2 1 0
-1 -2 9 8
7 6 5 4
result
257 210 223 176
338 276 298 236
419 342 373 296
81 54 51 24
27 18 57 48
45 30 87 72
visitor tracker