模板

C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

一.函数模板

1.定义:

template <typename T1, typename T2...>

函数返回类型  函数名 (参数表){...}

例:

template <typename T>
T my_min(T a, T b)
{
    return (a < b) ? a : b;
}

a. 模板的声明要与函数模板的定义紧挨

2.模板函数

在调用模板时,必须为它的类型参数提供实际的数据类型,编译器将利用该类型替代模板中的全部类型参数,自动生成代码,这个过程称之为模板的实例化。实例化生成的函数就是模板函数

3.模板参数

3.1.实例化过程不会进行隐式的类型转化,可以显式指定类型参数的类型

 my_min<double>(0.1,2) 

3.2.参数可以为非类型参数,并且只能向其传递常数,不能传递变量(见例2)

 二.类模板

与函数模板相似直接上例子

例3:

//Stack类模板
//Stack.h
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED using namespace std; template<typename T, int MAXSIZE> class Stack{ private: T elems[MAXSIZE + 1]; int n; // 元素个数 public: Stack(){n = 0;} void push(T e) { if(n == MAXSIZE) { cout << "栈已满,加入失败"<<endl; return; } elems[++n] = e; } void pop() { if(n == 0) { cout << "栈已清空"<<endl; return ; } n--; } T top() { if(n == 0) { cout << "栈已清空" <<endl; return 0; } return elems[n]; } }; #endif // STACK_H_INCLUDED

 

#include <iostream>
#include "Stack.h"
using namespace std;
int main()
{
    Stack<int,10> istack;
    for(int i = 0; i < 10; i ++ )
        istack.push(i);
    cout << istack.top() << endl;
    for(int i = 0; i < 9;i ++ )
        istack.pop();
    cout << istack.top() << endl;
    istack.pop();
}

 

 

 

例1:

//最小值函数的模板
#include <iostream> using namespace std; template <typename T> T my_min(T a, T b) { return (a < b) ? a : b; } template <typename T1, typename T2> T1 my_max(T1 a, T2 b) { return (a < b ) ? a : b; } int main() { cout << my_min(1,2) << endl; cout << my_min('b','a') << endl; cout << my_min(1.0,0.1) << endl; cout << my_min<double>(0.1,2) << endl; cout << my_max(1.3, 1) << endl; return 0; }

 

 

例2:

//排序函数模板
include <iostream> using namespace std; template <typename T, int n> T my_sort(T a[n]) { for(int i = 0; i < n - 1; i ++) { for(int j = 0; j < n - 1 - i; j ++) { if(a[j] > a[j + 1]) { T t = a[j + 1]; a[j + 1] = a[j]; a[j] = t; } } } } int main() { int a[] = {2,3,4,5,10,1,0}; my_sort<int,7>(a); cout <<a[0]<<endl; return 0; }

 

posted @ 2023-05-24 17:23  qlc23333  阅读(154)  评论(0)    收藏  举报