热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C++】模板template

前言:本教程使用到的工具是vs2010;目录为什么要使用模板?template模板函数模板类的模板template模板的本质总结为什

前言:本教程使用到的工具是vs2010;


目录

为什么要使用模板? 

template模板

        函数模板

        类的模板

template模板的本质 

总结




为什么要使用模板? 

        我们先来大概了解一下模板的概念,下面是菜鸟教程对于模板给出的解释:

        模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

        模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

        每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector  或 vector

        知道了模板的基本概念之后,我们先来看一段代码:

#include
#include void Sort(int* arr, int nLength)
{int ii;int kk;for(ii=0;iiarr[kk+1]){int temp = arr[kk];arr[kk] = arr[kk+1];arr[kk+1] = temp;}}}
}int main()
{return 0;
}

        这是一段最简单的冒泡排序代码,看不懂没关系,知道怎么用就行;

        继续往下:

        我们定义一个整型数组,里面存放被打乱了的几个整数,如下:

        然后我们调用函数,如下:

 

        调试:

 

        此时顺序是乱的,单步步过F10一下:

 

        已经重新排序;

        好了,我们现在知道这个函数怎么用了,继续往下看:

        我们知道在C语言中'a'和'b'是可以比较的,因为字符类型其实也就是整型,他们的比较是ascii码值的比较,'a'的ascii码值是97,'b'的是98,'c'的99....以此类推,那么我们是不是可以对字符进行排序呢?

        可以;

        我们复制一下上面的整形冒泡排序代码,改一点就行了,如下:

        我们定义一个字符数组,并进行排序,如下:

        调试:

 

        单步F10:

 

        排序成功!

        虽然我们达到了目的,但是我们违背了面向对象编程设计思想: 提高代码的复用性,减少重复代码的编写;

        但是,template模板可以帮我们解决这个问题,这也就是我们为什么要使用模板的原因了;


template模板

        template模板又分为函数模板和类模板,我们先讲函数模板;


        函数模板

        函数模板的格式:

        template

        返回值类型 函数名(参数列表)

        {

                函数体;

        }

        下面我们给我们的冒泡排序函数加上模板:

 

        !!!!注意看图片上的文字!!!!;

        然后把我们想要自适应类型的地方全部换成T就行了,如下:

        下面我们来测试,先测试int类型,如下:

 

        调试:

 

        F10:

 

        没有问题,接着我们测试char类型:

 

        调试:

 

        F10:

         

        没有问题;

        那么这个函数能对自己定义的类型进行排序吗?

        当然可以;

        如下,我们定义一个类:

        我们首先要知道,如果我们想给我们自己定义的类的对象进行排序的话,那么我们肯定要进行运算符重载;

        我们观察一下刚刚冒泡排序的函数,需要比较类的对象大小的地方有哪些:

        我们可以发现,就这一个地方需要对我们类的对象进行比较大小,而且是大于号;

        那么我们只需要重载'>'即可,如下:

        下面我们进行测试,定义对象,并调用模板函数:

 

        调试:

 

        F10:

 

        ok,没有问题;

        template模板成功的帮我们减少了重复代码的编写,提高了代码的复用性;


        类的模板

        先看代码:

#include
#include template
class CBase
{
public:int x;int y;char a;char b;int MAX(){if(x>y) return x;if(xb) return b;if(a};int main()
{return 0;
}

        定义了一个类,类中有四个成员变量;分别是int型的x、y;char型的a、b;

        然后x和y比较谁大返回谁,a和b比较谁小返回谁;

        我们来分析一下,这个类中大概有几个需要自适应类型的地方:

        我们知道了这个类中大概有两个地方需要自适应类型,那么接下来先声明这个类为模板类: 

        因为我们有两个需要自适应的类型,所以这里的class参数有两个;

        下面我们进行模板的替换:

 

         替换好了,下面我们进行测试:

        定义好对象以后,我们给对象的成员进行赋值:

 

        我们调用比较的成员函数:

 

        我们将鼠标悬停到MAX和MIN上:

 

 

        可以看到,在我们CBase声明之后,编译器就已经知道MAX和MIN函数的类型了;我们接收一下返回值,如下: 

        观察r和t:

 

        没有问题;

        当然在类中的模板中,也是可以比较类的对象的,依旧需要重载运算符,这里我就不演示了;


template模板的本质 

        下面我们来说一下,template模板的本质:

        代码如下:

#include
#include class CBase
{
public:int x;int y;CBase(int x,int y){this->x = x;this->y = y;}bool operator>(CBase& right) // 因为我们'>'有两个操作数,左是this指针,那么这里的右操作数只能传一个参数;{return this->x > right.x && this->y > right.y; // 返回左操作数大于右操作数的结果,如果左大于右就为真,否则为假,达到了大于号的目的;}
};template // 只需要在这里加上模板声明即可
void Sort(T* arr, int nLength)
{int ii;int kk;for(ii=0;iiarr[kk+1]){T temp = arr[kk];arr[kk] = arr[kk+1];arr[kk+1] = temp;}}}
}int main()
{int arr1[5] = {2,1,4,5,3};char arr2[5] = {'c','b','d','a','e'};CBase c1(2,2),c2(1,1),c3(4,4),c4(3,3),c5(5,5);CBase arr3[5] = {c1,c2,c3,c4,c5};Sort(arr1,5); // 此处下断点system("pause");return 0;
}

        首先我们先对arr1进行排序,断点下载Sort;编译、调试、alt+8转到反汇编,如下:

        template模板在底层已经识别了改排序是int类型的排序,这没有问题;

        然后我们将arr2也假如排序,那么template底层会怎么做呢?

 

        编译、调试、alt+8反汇编:

 

        可以看到template模板在底层又重新生成了一个函数,用于char类型的排序;

        那么arr3如果加入排序的话,相比大家也都知道结果了,这里我就不测试了;感兴趣的话可以自己测试一下;

        现在我们可以总结一下template的本质是什么了;

        template模板并没有我们想的那么高大上,就是说仅仅一个函数可以千变万化,其实并不是千变万化也并不是一个函数;

        我们刚刚也看到了,模板的底层就是通过看你传入参数的类型,给你分配一个适用你传入类型的函数,你传入int类型,他就给你一个适用int类型的函数,你传入char他就给你一个适用char类型的函数;如果你连续传入int、char等n个类型进行排序,那么他的底层就会给你分配n个函数,并不是一个函数实现的类型自适应;


总结

        1、我们使用模板的目的就是为了提高代码的复用性,减少重复代码的编写;

        2、函数模板的底层并不是只有一个函数完成的,它是根据你传入参数的类型,给你分配一个适用你传入类型的函数;如果你连续传入n个类型,他就会给你分配n个函数;

结语:

        文章讲义到此结束,如果有讲错的地方或者说讲的不好的地方,望指出;感谢大家观看!


推荐阅读
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
墨镜元龙高卧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有