C/C++_log2000_函数模板与类模板笔记1

来源:互联网 发布:易娱网络怎么样 编辑:程序博客网 时间:2024/04/27 22:02

函数模板与类模板的相关笔记 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     6middle     8     5    34    10     7    45    12     9    56    23     2     2     1     4     4     3     6     6matrix2     3     2     1     0    -1    -2     9     8     7     6     5     4result   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
访客追踪插件