模版初阶【C++】

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋模版初阶

  • 🍑泛型编程
    • 🍍泛型编程的定义
    • 🍍泛型编程的由来
    • 🍍泛型编程的应用
  • 🍑函数模版
    • 🍍函数模版概念
    • 🍍函数模版原理
    • 🍍函数模版应用
    • 🍍模版参数的匹配原则
  • 🍑类模版
    • 🍍类模版的概念
    • 🍍类模版实例化

🍑泛型编程

🍍泛型编程的定义

在C++中,泛型编程是一种编程范式,它允许程序员编写与数据类型无关的代码。这样,你可以写出一段通用的代码,然后应用于多种数据类型,而不需要为每种数据类型都重新编写代码。泛型编程的核心概念是模板。

C++中有两种主要的模版:函数模版和类模版。

🍍泛型编程的由来

泛型编程的概念起源于对算法和数据结构通用性的追求。其最早的实践可以追溯到1970年代的CLU和Ada语言。在这些早期的语言中,程序员开始尝试编写不依赖于特定数据类型的通用算法。

随着时间的推移,泛型编程的概念逐渐发展并得到了更广泛的应用。1980年代,泛型编程开始被正式提出并应用于一些主流的编程语言中,如C++。C++引入了模板(template)机制,允许程序员编写可以处理多种数据类型的通用代码。

在1990年代,随着面向对象编程(OOP)的普及,泛型编程也开始被应用于面向对象的语言中,如Java。Java在J2SE 5.0(JDK 1.5)中引入了泛型技术,使得类和接口可以使用类型参数,进一步提高了代码的灵活性和重用性。

此后,泛型编程逐渐成为了现代编程语言中的一个重要特性,被广泛应用于数据结构、算法、框架等领域。它不仅提高了代码的重用性和灵活性,还增强了类型安全性,有助于减少运行时错误。

🍍泛型编程的应用

平常我们在解决一个算法时,需要构建一个函数来解决此算法,而这个函数我们需要写出通用的一个写法,不然没有什么意义,比如此函数可以解决参数为int型的,但解决不了类型为double型的,这就要你重新写一个函数可以解决类型为double的,这样就会很麻烦,比如:

int Add(int a, int b)
{
	return a+b;
}
float Add(float a, float b)
{
	return a+b;
}
double Add(double a, double b)
{
	return a+b;
}

上面三个加法函数只能解决自己类型的参数问题,算法相同,仅仅只是参数类型不同,这就很麻烦。
这就要提到我们今天的主角——模版,我们能不能通过给系统一个模版,然后编译器根据不同的类型来生成代码呢?
看下面分析,主要从函数模版和类模版介绍。

🍑函数模版

🍍函数模版概念

函数模板是C++泛型编程的一个重要组成部分,它允许程序员定义一种行为,该行为可以作用于多种不同的数据类型,而无需为每种数据类型都重新编写函数。函数模板通过引入类型参数(通常是使用typenameclass关键字声明的),来创建一种可以处理多种数据类型的函数。

函数模板的定义使用template关键字开始,后面紧跟一个尖括号==<>,其中包含了类型参数列表==。类型参数类似于函数参数,但它们是用于指定函数内部使用的数据类型的。

🍍函数模版原理

函数模版的原理是基于数据类型的参数化,关键是将一组算法相同,但所处理数据类型不同的重载函数。
如:
在这里插入图片描述

template<class T>
T Add(T a, T b)
{
	return a+b;
}

该用template修饰的Add()函数,就是一个加法函数的模版。

在编译器实际应用过程中并不是直接调用这个模版,而是间接通过模版构建一个关于此类型的加法函数,也就是上面那三个函数。

🍍函数模版应用

在这里插入图片描述

上图中,我们展示同类型参数传入的模版,如果两个参数是不同类型的该怎么写呢?
不同类型:

int Add(int a, float b)
{
	return a+b;
}

float Add(int a, float b)
{
	return a+b;
}
double (int a, double b)
{
	return a+b;
}

上面代码就是不同类型的参数,但实际返回还是看函数的类型,如第一个加法函数,虽然a是int类型,b是float类型,最后返回的确实int类型,因为此函数是int类型的。
那这个有没有模版呢?答案肯定是有的。

template<class T1, class T2>
T1 Add(T1 a, T2 b)
{
	return a+b;
}

上诉代码就是该类型模版的写法。
在这里插入图片描述
同样的道理,从图中我们可以看出,当需要用到此时函数时,并不是实际去调用这个函数,而是这个编译器可以根据你提供的这个模版,再根据你参数的类型自动生成这个类型的函数。

总结,关于这个函数模版,在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

当我们知道这个模版的用法后,其实表面的工作由我们转到了编译器,编译器帮我们做了许多的工作。

🍍模版参数的匹配原则

关于这个模版参数的匹配原则,该程序中有该函数模版,但也有该类型的处理函数,那实际调用过程中,编译器会优先使用那个呢?接下来我直接用程序执行结果来给大家演示:

#include<iostream>
using namespace std;
int Add(int a, int b)
{
	cout << "没有使用类模版函数函数" << endl;
	return a+b;
}

template<class T>
T Add(T a, T b)
{
	cout << "使用了类模版函数" << endl;
	return a+b;
}

int main()
{
	int a = 2;
	int b = 8;
	int ret = Add(a, b);
	cout << ret << endl;
	return 0;
}

在这里插入图片描述
从上图中就可以看到结果了。

对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模
板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

🍑类模版

🍍类模版的概念

类模板是一个参数化类型,它允许我们创建一个通用的类,其数据成员、成员函数的返回类型和形参类型不是具体指定的,而是用一个虚拟的类型或值来代替。这样,当我们实际使用类模板时,可以根据传入的类型或值参数来生成特定类型的类实例。

类模板的定义通常以关键字template开始,后面跟着模板参数列表,然后是类名。模板参数列表可以包含类型参数和非类型参数。类型参数通常使用typename或class关键字来修饰,表示不确定的类型;非类型参数则是具体的参数,如整数或字符等。

使用类模板有许多优点,包括提高代码的可重用性、效率和可维护性,减少代码冗余,以及提高代码的可读性和性能。通过类模板,我们可以轻松地创建支持各种数据类型的类,而不必为每个数据类型单独编写代码。

🍍类模版实例化

具体格式看下列代码:

template<class T1, class T2, class T3,......>
class //类模板名
{
 // 类内成员定义
};

上诉就是类模版的格式。

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>
中即可,类模板名字不是真正的类,而实例化的结果才是真正的类.

关于类模版后面用起来会非常方便,目前大家可能接触不多,等大家学到后面,就能理解了。

关于本本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!

请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/567489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NLP自然语言处理_序章

开一个新篇章&#xff0c;立一个flag&#xff0c;用一段时间来学习一下NLP&#xff0c;涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门&#xff0c;此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理&#xff1f; NLP…

云原生的基石:containerd引领未来容器发展趋势

文章目录 一、Containerd简介&#xff1a;容器技术的心脏二、Containerd核心原理解析三、Containerd与Docker的关系四、Containerd在云原生应用部署中的作用五、Containerd的扩展性和插件机制六、Containerd的安全特性七、Containerd的性能优化八、Containerd的社区和生态系统九…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

RTSP/Onvif视频监控平台EasyNVR如何提高匿名用户的用户名和密码安全性?

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

Python-VBA函数之旅-input函数

目录 一、input函数的常见应用场景&#xff1a; 二、input函数使用注意事项&#xff1a; 三、如何用好input函数&#xff1f; 1、input函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博…

hcia datacom课程学习(7):直连路由、静态路由

直连路由路由器接口上的网络&#xff08;接口配置了IP地址并且开启&#xff09;静态路由管理员手工添加的网络动态路由路由器之间动态学习形成的网络 1.直连路由 每当给路由器的一个接口配置了ip&#xff0c;路由表中就会产生对应的直连路由 配置路由接口ip的命令&#xff1…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

【国产替代】航空电子通信总线航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持

航空电子通信总线 航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持。这些产品用于进行航空电子应用所需的开发、生产和系统测试。 PXIe&#xff0c;2通道PXI ARINC-664接口模块 AIM ARINC-664具有板载处理器&#xff0c;可自动处理所有与协议相关的活动&…

Java进阶-日志框架

概述 小结 体系 Logback概述 Logback快速入门 1.下载 一般情况&#xff0c;Logback日志框架只需要下载slf4j-api、logback-core、logback-classic这三个jar包即可。 slf4j-api-1.7.26.jar官网下载链接&#xff1a; https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7…

docker部署通义千问-7B-Chat的openai-api环境

服务器环境&#xff1a; 显卡驱动&#xff1a;Driver Version: 530.30.02 CUDA版本&#xff1a;CUDA Version: 12.1 显卡&#xff1a;NVIDIA GeForce RTX 3090共4张 注意&#xff1a;最好把显卡驱动升级到530&#xff0c;CUDA版本之前使用11.7有问题。 一、下载模型文件 …

炉管设备的内部构造详解

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff09;里的学员问&#xff1a;炉管设备&#xff08;立式&#xff09;的内部构造是怎样的&#xff1f; 如上图&#xff0c;是一个典型的&#xff1a; 上半部&#xff1a; Heating Element&#xff08;加热线圈…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例&#xff1a; 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘&#xff0c;创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口&#xff0c;发…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器&#xff0c;集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流&#xff0c;展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件&#xff0c;并且采用了节省空间的ESO…

JRT多服务器同步程序

之前的JRT只部署在一个服务器&#xff0c;实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步&#xff0c;但是有个问题是Rsync同步jar之后他不知道是否需要重启站点&#xff0c;为此实现java控制台驱动Rsync&#xff0c;重定…

8.4.1 实验1:创建 VLAN 和划分端口

1、实验目的 通过本实验可以掌握&#xff1a; VLAN的概念。创建VLAN的方法。把交换机端口划分到VLAN中的方法。 2、实验拓扑 创建 VLAN 和划分端口的实验拓扑如下图所示。 图8-5 创建 VLAN 和划分端口的实验拓扑 3、实验步骤 &#xff08;1&#xff09;实验准备 S1#eras…

【Elasticsearch】Elasticsearch 从入门到精通(一):基本介绍

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章&#xff1a; Elasticsearch 从入门到精通&#xff08;一&#xff09;&#xff1a;基本介绍Elasticsearch 从入门到精通&#xff08;二&#xff09;&#xff1a;基础使用 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区&#xff01; 去年 12 月&#xff0c;Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…

Vue Router基础知识整理

Vue Router基础知识整理 1. 安装与使用&#xff08;Vue3&#xff09;安装使用 2. 配置路径别名和VSCode路径提示&#xff08;了解&#xff09;3. 使用查询字符串或路径传参query动态路由 与 params 4. router-link、定义别名、定义路由名称、编程式导航定义别名 aliasrouter-li…

目标检测——行人交通信号灯数据集

一、重要性及意义 行人交通信号灯检测的重要性及意义主要体现在以下几个方面&#xff1a; 首先&#xff0c;行人交通信号灯检测对于提高道路安全性至关重要。通过准确识别交通信号灯的状态&#xff0c;行人可以更加清晰地了解何时可以安全地过马路&#xff0c;从而避免与车辆…