首页 > 编程语言 >C++--STL函数模板

C++--STL函数模板

时间:2024-03-31 20:31:56浏览次数:22  
标签:return 函数 v1 -- v2 C++ STL int 模板


一.函数模板

我们可以定义一个函数模板(function template),而不是为每个类型都定义一个函数。一个函数模板就是一个蓝图,可用来生成针对特定类型的函数。

例如用于比较两个数字的大小compare()函数的模板如下:

template <typename T>
int compare(const T &v1,const T &v2)
{
    if(v1 > v2) return 1;
    if(v2 > v1) return -1;
    return 0;
}

二.函数模板语法

函数模板格式如下:

template<typename T,typename T2,…>
函数返回类型 函数名(模板形参表)
{
	函数体
}

说明:
(1)template : 声明创建模板;
(2)typename : 类型名称,表示后面跟的是类型名,可以用class替代typename;
(3)T : 通用类型名,一般使用大写 T;
(4)< >里面的类型参数可以有一个或多个,每个模板形参前必须有关键字 class或typename,多个类型参数之间用逗号分隔;
使用举例:

#include <iostream>
#include <string>
using namespace std;

template<typename T>
int compare(const T& v1, const T& v2)
{
    if (v1 > v2) return 1;
    if (v2 > v1) return -1;
    return 0;
}

int main()
{
    int a = 10;
    int b = 20;
    double c = 12.4;
    double d = 8.6;

    cout << compare(a, b) << endl;
    cout << compare(c, d) << endl;

    return 0;
}

1.1.1 实例化函数模板
当我们调用一个函数模板时,编译器用实参来为我们推断模板类型。例如在下面的调用中:

template<typename T>
int compare(const T& v1, const T& v2)
{
    if (v1 > v2) return 1;
    if (v2 > v1) return -1;
    return 0;
}

int a = 10;int b = 20;
cout << compare(a, b) << endl; //a,b是int,推断 T是int

compare实参类型是int,编译器会推断出模板T为int。
在如下的代码中:

double c = 12.4; 
double d = 8.6;
cout << compare(c, d) << endl;//c,d为double,推断T是double

compare实参类型是double,编译器会推断出模板T为double。
函数模板告诉编译器如何定义函数。当调用实参是 int时,编译器将按函数模板创建这样的函数,并用int代替T;当调用实参是double时,编译器将按函数模板创建这样的函数,并用double代替T。下面是vs2022的一段反汇编,仅供参考。

1.1.2 模板类型
模板类型:在上例中 T就是模板类型。
一般来说,我们可以将模板类型看作类型说明符,就像内置类型一样使用。可以用来指定返回值类型,函数参数类型,以及在函数体内用于变量声明。


template<typename T>
T fun(T* p) //T作为返回值,T做形参
{
    T tmp = *p; //T定义变量
    //...
    return tmp+1;
}

int main()
{
    int a = 10;
    cout << fun(&a) << endl;

    return 0;
}

说明:
1.模板类型前必须使用关键字class或typename;

template <typename T,U>//错误,U前面必须加class或typename 
T fun(const T&v1,const U&v2);

在模板参数列表中,这class和typename两个关键字的含义相同,可以互换。一个模板参数列表中可以同时使用这两个关键字

template <typename T,class U>//正确,class和typename可以互换 
T fun(const T&v1,const U&v2);

建议使用typename,这个关键字更直观。但typename是后引入C++的,有些程序还在使用class。
1.1.3 编写要求
通常,我们将类声明和函数声明放在头文件中,函数定义和类成员函数的定义放在源文件中。
模板则不同:为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。因此,模板声明也和定义都放在头文件中(有时不写文件后缀名)。
编写模板时,代码不能是针对特定类型的,但模板代码通常对其所使用的类型有一些假设。例如,在compare 函数中的代码就假定类型定义了 > 运算符。

if (v1 > v2) return 1; //T类型必须支持 > 运算符
if (v2 > v1) return -1;//T类型必须支持 > 运算符

1.1.4 函数模板实参推断
●函数模板调用时,如果不能从实参推断出模板实参,就必须显式指定它

template<typename T>
T Max(T a, T b)
{
    cout << "T Max(T,T)" << endl;
    return a > b ? a : b;
}

int main()
{
    int a = Max(10, 20);
    //int b = Max(200, 'a');//错误,不能通过实参推断出模板实参
    int c = Max<int>(200,'a');//可以,显式指定类型为int
    int d = Max(200,(int)'a');//可以,显式类型转换,可以通过实参推断

    return 0;
}

1.1.5 函数模板重载
可以定义多个同名的函数模板,甚至同名的函数模板和普通函数可以同时存在。例如:

#include <iostream>
using namespace std;

int Max(int a, int b)
{
    cout << "int max(int,int)" << endl;
    return a > b ? a : b;
}

template<typename T>
T Max(T a, T b)
{
    cout << "T max(T,T)" << endl;
    return a > b ? a : b;
}

template<typename T>
void Max(T a, T b, T c)
{
    cout << "T max(T,T,T)" << endl;
}

int main()
{
    int a = Max(10, 20);//普通函数
    int b = Max('a','A');//函数模板
    Max(10,20,30);//函数模板

    return 0;
}


本篇完!

标签:return,函数,v1,--,v2,C++,STL,int,模板
From: https://blog.csdn.net/m0_75266675/article/details/136885747

相关文章

  • C++初阶篇----内存管理
    目录引言1.内存分布2.C动态内存管理方式:malloc/calloc/realloc/free3.C++动态内存管理:new和delete3.1内置类型3.2自定义类型4.operatornew与operatordelete函数4.1operatornew与operatordelete函数5.new和delete的实现底层5.1内置类型5.2自定义类型引......
  • 2024 python毕业设计(论文)- python毕设选题大全 - 选题指导精编版
    目录前言python毕设选题开题指导建议更多精选选题选题帮助最后前言大家好,这里是海浪学长毕设专题!大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理了计算机专......
  • 毕业设计:基于图像增强的交通标志识别系统 深度学习 机器视觉
    目录前言课题背景和意义实现技术思路一、算法理论基础1.1 直方图均衡化1.2SKNet 分类模型二、 数据集三、实验及结果分析3.1 实验环境搭建3.2 模型训练最后前言  ......
  • 快速排序(C语言实现)此文章由vivo的AI蓝心小v生成
    当然可以。快速排序是一种非常高效的排序算法,由英国计算机科学家霍尔(C.A.R.Hoare)于1962年提出。它的基本思想是采用分治法(DivideandConquer)来进行排序。###快速排序的基本步骤:1.**选择基准值(Pivot)**:从待排序的序列中选取一个元素作为基准值。这个元素可以是序列的第一......
  • 对于结构体的见解(新手)
    不知道还能坚持多久,是没有自信了还是?不试试怎麽知道?希望自己以后可以挣好多好多钱,不要在为钱发愁!!!加油吧,少年!!!首先结构体是自定义类型的,它里面包含许多成员变量,  结构体内存对齐对齐规则 vs中的默认对齐数为8    修改默认对齐数 intb[1000]; 位段......
  • 全面修复-由于找不到d3dx9_43.dll,无法继续执行代码
    在计算机打开游戏和运行过程中,常常会遇到一些错误提示,其中最常见的就是缺少某个动态链接库(DLL)文件。而d3dx9_43.dll文件就是其中之一。本文将对d3dx9_43.dll文件进行总体介绍,帮助读者了解该文件的作用、安装方法以及常见问题的解决方法。 一,d3dx9_43.dll文件对系统的用途......
  • 模型调优的艺术:超参数调整与集成方法
    目录1.前言2.超参数搜索策略2.1.网格搜索(GridSearch)2.2.随机搜索(RandomSearch)3.模型集成技术3.1.Bagging(BootstrapAggregating)3.2.Boosting4.实例:优化现有模型性能5.总结1.前言         模型调优是机器学习实践中至关重要的一环,它关乎模型能否在新......
  • C#的笔记~Four
    1.算术运算符(1)使用/运算符时注意:除数可以是不为0的整数(2)使用%运算符时的注意:返回结果的符号与左操作数相同2.赋值运算符(1)简单赋值运算符量=值↗↖做写的操作,做读取操作,可以是常量、表达式被赋予等号右侧的值(2)复合赋值运算符:又称为带运算的......
  • 随记
    2021软件工程第一次个人作业一、回顾你过去将近3年的学习经历1.当初你报考的时候,是真正喜欢计算机这个专业吗?当初我报考计算机专业时,并不是出于对这个领域的热爱,而是觉得这是一个未来有前景、能够提供稳定就业机会的专业。虽然起初并没有深深地喜爱这个领域,但随着学习的深入,......
  • Activate Guided Access mode to protect your privacy on iPhone
    Ifyoudon'tintendtosetupanAppLockforspecificapps,isthereasimplerwaytoachievethesamegoal?Theansweriscertainlyyes,andthatisbysettingup[GuidedAccessmode]whichconfinesactivitiestoasingleapp.Thismodeisnotenab......