【C++】11___模板(1)

news/2024/12/17 13:25:54/

目录

一、模板的概念

 二、函数模板

 三、普通函数与函数模板

3.1区别

3.2调用规则


一、模板的概念

  • 模板不能直接使用,它只是一个框架
  • 模板的通用并不是万能的
  • 分为两类:函数模板、类模板

 二、函数模板

  • 函数模板语法:

        template<typename  T >

        函数声明或定义

  • 解释:

template ---  声明创建模板

typename  --- 表面其后面的的符号是一种数据类型,可以用class代替

T ---  通用的数据类型,名称可以替换,通常为大写字母

 代码示例

#include<iostream>
using namespace std;template<typename T>
void Swap(T &a, T &b){T tmp = a;a = b;b = tmp;
}
void test(){int a = 10;int b = 20;//自动类型推导Swap(a,b);cout<<"a="<<a<<"  b="<<b<<endl;double c = 1.1;double d = 2.2;// 显示指定类型Swap<double>(c,d);cout<<"c="<<c<<"  d="<<d<<endl;
}
int main(){test();return 0;
}

排序案例---代码说明

#include<iostream>
using namespace std;//交换模板
template<typename T>
void Swap(T &a,T &b){T tmp = a;a = b;b = tmp;
}//排序模板
template<typename T>
void Sort(T &charArr,int &len){for(int i=0;i<len;i++){int max = i;for(int j=i+1;j<len;j++){if(charArr[max] < charArr[j]){max = j;}}if(max != i){Swap(charArr[max],charArr[i]);}}
}// 打印数组模板
template<typename T>
void print(T &Arr,int &len){for(int i=0;i<len;i++){cout<<Arr[i]<<" ";}cout<<endl;
}void test(){char Arr[] = "bdacfe";  // 字符排序int len = sizeof(Arr) / sizeof(char);Sort(Arr,len);print(Arr,len);}void test1(){int Arr1[] = {4,7,1,3,6,0,8,2,5,9};  // 数组排序int len = sizeof(Arr1) / sizeof(int);Sort(Arr1,len);print(Arr1,len);
}
int main(){test();test1();return 0;
}

 三、普通函数与函数模板

3.1区别
  • 普通函数调用时可以发生隐式类型转换
  • 函数模板调用时,自动类型推导(不会发生隐式类型转换)、显示指定类型(可以发生隐式类型转换)

 代码示例

#include<iostream>
using namespace std;int Add(int a, int b){return a+b;
}template<typename T>
int Add1(T a, T b){return a+b;
}void test(){int a = 10;char c = 'c';cout<<Add(a,c)<<endl; // 109
//	cout<<Add1(a,c)<<endl;//错误cout<<Add1<int>(a,c);//109}int main(){test();return 0;
}
3.2调用规则
  1.  如果函数模板和普通函数都可以实现,优先调用普通函数
  2. 可以通过空模板参数列表来强制调用函数模板
  3. 函数模板也可以发生重载
  4. 如歌函数模板可以产生更好的匹配,有限调用函数模板

代码示例 

#include<iostream>
using namespace std;void print(int a, int b){cout<<"普通函数的调用"<<endl;
}template<typename T>
void print(T a, T b){cout<<"函数模板的调用"<<endl;
}template<typename T>
void print(T a, T b,T c){cout<<"函数模板重载的调用"<<endl;
}void test(){int a = 1;int b = 1;print(a,b);//普通函数的调用print<>(a,b);//函数模板的调用print(a,b,1);//函数模板重载的调用char c = 'a';char d = 'a';print(c,d);//函数模板的调用,因为调用普通函数时需要进行隐式转换
}int main(){test();return 0;
}

http://www.ppmy.cn/news/1555864.html

相关文章

R环境配置 以及Debug方法 (VSCode, conda, 远程R)

生物信息学中的R环境配置 以及Debug方法 开始设置1、建议使用VSCode conda 远程R2、 VSCode配置安装插件安装好插件后&#xff0c;远程设置链接成功后&#xff0c;设置项目 3、 linux conda 和 远程R配置4、VScode 远程访问R环境下面配置远程R 5、开始Debug新建个R文件&#…

day13 python(1)——python基础

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 1、python简介 1.1 为什么学习python 1.2 python发展历史 python2.x和python3.x 版本里面有些是不兼容的。&#xff08;我自己本地版本 3.11&#xff09; 2、语言的分类 &#xff08;1&#xff09;编译型 …

MySQL的历史和地位

秋招之后&#xff0c;开始深入学习后端开发知识啦。把学到的东西分享给大家最开心啦。就从MySQL开始吧。 首先说一下MySQL的历史和地位。主要是看一下我们为什么要学习&#xff0c;而不是说让我们学什么我们就学什么。 地位 这张图是我从DB-Engines截取的2024年12月最新的数据…

百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!

百度智能云千帆 AppBuilder 发版升级&#xff01; 进一步降低开发门槛&#xff0c;落地大模型到应用的最后一公里。在千帆 AppBuilder 最新升级的 V1.1版本中&#xff0c;企业级 RAG 和 Agent 能力再度提升&#xff0c;同时组件生态与应用集成分发更加优化。 • 企业级 RAG&am…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…

LWIP数据包管理

一、LWIP数据包简介 具体流程为&#xff1a; 用户要发送的数据&#xff1b;申请pbuf内存&#xff1a;一般使用的是内存堆&#xff08;内存池也可以&#xff09;。内存堆包含了pbuf结构体、以及后面要拷贝的数据和三种层的首部&#xff1b;将数据拷贝到pbuf数据缓冲区&#xf…

【人工智能】OpenAI O1模型:超越GPT-4的长上下文RAG性能详解与优化指南

在人工智能&#xff08;AI&#xff09;领域&#xff0c;长上下文生成与检索&#xff08;RAG&#xff09; 已成为提升自然语言处理&#xff08;NLP&#xff09;模型性能的关键技术之一。随着数据规模与应用场景的不断扩展&#xff0c;如何高效地处理海量上下文信息&#xff0c;成…

第六届地博会开幕,世界酒中国菜美食文化节同期启幕推动地标发展

第六届知交会暨地博会开幕&#xff0c;辽黔欧三地馆亮点纷呈&#xff0c;世界酒中国菜助力地理标志产品发展 第六届知交会暨地博会盛大开幕&#xff0c;多地展馆亮点频出&#xff0c;美食文化节同期启幕推动地标产业发展 12月9日&#xff0c;第六届粤港澳大湾区知识产权交易博…