由排序算法浅析C++函数模板

 Ⅰ )概述

       C++最重要的特点之一就是代码重用,为实现代码重用,代码必须具有通用性。通用代码应不受数据类型的影响,并且可以自动适用数据类型的变化。这种程序设计类型称为参数化程序设计。模板是C++支持参数化程序设计的工具,通过它可以实现参数化多态性。所谓参数化多态性,就是将程序所处理的对象的类型参数化,使一段程序可以用于处理多种不同类型的数据。以排序算法为例:排序算法是写程序过程中比较常用的算法,如果我们定义了一个整形数组,例如:int a[10];用来存储我们需要进行排序的数列,如果数据不是int 类型,而是别的类型(比如:float、double、char等)怎么办?那就需要另外定义修改数据类型。工作是类似的,但重复而繁琐。如果我们把所适用的数据类型不具体写出,而是用一个类型形式参数(比如:T)来表示。那就只需要一个类定义就行。使用时,将实际数据类型(比如:float)取代类型形式参数(T),就可以获得符合float类型的具体类型定义了。


Ⅱ )模板函数


2.1 函数模板

        C++建立了函数模板的概念。如果能写一段通用代码代码适应于多种不同数据类型,便可以使代码的可重用性大大提高,从而提高软件的开发效率。使用函数摸就是为了这一目的。只需对函数模版编写一次,然后基于调用函数时提供的数据类型,C++编译器将自动产生相应的函数来正确的处理该类型的数据。


我们看一个特别熟悉的排序算法:

#include<iostream>
using namespace std;
 
//定义函数模板
template<class T>
void Mpsort(T *p, int len)       //冒泡排序算法
{
    T t;
    for (int i = 0; i < len - 1; i++)
    {
        for (int j = 0; j<len - 1 - i; j++)
        {
 
            if (p[j]>p[j + 1])
            {
                t = p[j];
                p[j] = p[j + 1];
                p[j + 1] = t;
            }
        }
    }
}
 
template <typename T>
void show(T* p, int len)         //输出结果
{
    Mpsort(p, len);
    for (int i = 0; i < len; i++)
    {
 
        cout << p[i] << "\t";
    }
    cout << endl;
}
 
int main()
{
    int a[] = { 1, 2, 4, 7, 5, 9, 8, 6, 0, 3 };
    int len = sizeof(a) / sizeof(a[0]);
    show(a, len);
    double b[] = { 5.6, 2.3, 3.4, 2, 1, 4, 5 };
    show(b, 7);
    return 0;
}

 

程序运行结果:


      我们可以看到定义的两个数组,int 型和 double 型都进行了正确排序,并输出结果。在b数组中同时存在整形数据和浮点型数据,如果在C语言中,编译会出现错误,无法正常运行,C++提供了函数模板,在函数前进行声明,当调用函数传参时,系统减函数的类型取代函数模版中定义的参数类型,从而有效的解决了这一问题,实行对不同数据类型的操作,从而提高代码重用性。虽然以上代码不能很好的体现C++ 抽象、封装、继承和多态的特点,但可以很好的帮助我们理解函数模板。


2.2 函数模板的简要介绍

       函数模板的定义形式是:
    template<模板参数表>
    类型名 函数名(参数表)
    {
    函数体的定义
    }

函数模板的声明格式为:

 
template<typename T>    

模板生命中参数类型可以有多种,如T1、T2、T3...模板声明的一般形式是:

    template<typename T1, typename T2, typename T3,... >

       其中,template 含义是模板。尖括号中 typename 可以用 class 替代,表示类型参数名,各形参间相互用逗号隔开。类型参数也可以用别的字符表示。

         所有的函数模板的定义都是以template 开始的,class(或者typename )标识符,指定可以接受一个类型参数。这些类型参数代表的是类型,可以是内部类型或自定义类型。类型参数可以用来指定函数模板本身的形参类型、返回值类型,以及声明函数中的局部变量。函数模板中函数体的定义方式与普通函数类似。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值