模版初阶【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://xiahunao.cn/news/2979325.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI人工智能培训老师叶梓:大数据治理的关键工具:开源数据血缘分析系统

在大数据时代&#xff0c;数据的产生和传播速度日益加快&#xff0c;数据之间的关系也变得日益复杂。为了更好地管理和理解数据之间的关系&#xff0c;数据血缘分析系统应运而生。本文将介绍几个开源的数据血缘分析系统&#xff0c;它们在数据治理、数据质量管理和数据隐私保护…

Apache Answer 开源问答社区安装体验

Answer 是由 SegmentFault 思否团队打造的一款问答平台软件,后端使用 Go 语言编写,于2022年10月24日(程序员节)正式开源。你可以免费使用 Answer 高效地搭建一个问答社区,并用于产品技术问答、客户支持、用户交流等场景。 2023年10月9日,Answer 顺利通过投票,以全票通过…

自己写的爬虫小案例

网址&#xff1a;aHR0cDovL2pzc2NqZ3B0Lmp4d3JkLmdvdi5jbi8/dXJsPS92aWV3L3dvcmtpbmdVbml0L3dvcmtpbmdVbml0Lmh0bWw 这串代码能够爬取勘察单位企业的详细信息。 import requests import time import csv f open(勘察单位公司信息.csv,w,encodingutf-8,newline) csv_writer …

详解QString与QByteArray使用对比

QString与QByteArray是Qt库中两种不同的字符串/字节序列容器&#xff0c;各自服务于特定的应用场景。本篇文章将详细解析它们的异同&#xff0c;帮助您在实际编程中准确选择和有效地使用这两种类型。 参考 QString类的使用 相同之处 构造与初始化&#xff1a; 两者都支持直接使…

2024深圳杯东三省A题全保姆教程 多个火箭残骸的准确定位

A题 多个火箭残骸的准确定位 问题1 &#xff1a;建立数学模型&#xff0c;分析如果要精准确定空中单个残骸发生音爆时的位置坐标&#xff08;经度、纬度、高程&#xff09;和时间&#xff0c;至少需要布置几台监测设备&#xff1f;假设某火箭一级残骸分离后&#xff0c;在落点附…

面试算法题之暴力求解

这里写目录标题 1 回溯1.1 思路及模板1.1 plus 排列组合子集问题1.2 例题1.2.1 全排列1.2.2 N 皇后1.2.3 N皇后问题 II1.2.4 子集 &#xff08;子集/排列问题&#xff09;1.2.4 组合(组合/子集问题)1.2.5 全排列 &#xff08;排列问题&#xff09;1.2.1做过1.2.6 子集II &#…

金融时报:波场亮相哈佛大学并举办TRON Builder Tour活动

近日,波场TRON作为顶级白金赞助商出席哈佛区块链会议并成功举办TRON Builder Tour哈佛站活动,引发海外媒体热议。美联社、金融时报、Cointelegraph等国际主流媒体及加密知名媒体均对此给予了高度评价,认为本次大会对TRON Builder Tour活动具有里程碑意义,彰显了波场TRON致力于促…

Linux加强篇-Vim编辑器

目录 ⛳️推荐 Vim文本编辑器 编写简单文档 配置主机名称 配置网卡信息 配置软件仓库 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Vim文本编辑器 在Linux系统中一切都…

windows10小皮安装不同版本composer,实现自由切换使用

1、使用phpstudy小皮面板安装composer1.8.5和composer2.5.8两个版本&#xff1b; 2、打开刚才安装的composer安装目录&#xff1a;D:\phpstudy_pro\Extensions 3、打开composer1.8.5版本&#xff0c;修改composer.bat名称为composer1.8.5.bat&#xff1a; 4、打开composer2.5.8…

8【PS作图】画一个“像素云朵”

选择64*128像素大小&#xff0c;横向画布 选择“油漆桶”工具&#xff0c;“容差”调整为0&#xff0c;取消“锯齿”&#xff0c;勾选“连续的”&#xff0c;这样方便后续上色&#xff0c;并且边缘都是像素风格的锯齿状 点击画布&#xff0c;变成蓝色天空 画云朵&#xff0c;首…

Docker镜像与容器的命令与基本操作

目录 一、docker基本命令 1、查看镜像 2、查看所有容器的状态 3、docker的run指令 4、run的工作流程 5、查看docker版本的命令 6、查看docker信息 7、docker帮助命令文档 二、docker镜像操作 1、搜索镜像&#xff08;公共仓库&#xff09; 2、下载镜像 3、查看镜像…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

混合云构建-如何创建一个高可用的Site to Site VPN 连接 Azure 和GCP云

在现代云计算环境中,企业通常会采用多云战略,将工作负载分布在不同的云服务提供商上。这种方式可以提高可用性、降低供应商锁定风险,并利用每个云提供商的独特优势。然而,在这种情况下,需要确保不同云环境之间的互联互通,以实现无缝的数据传输和应用程序集成。 本文将详细介绍…

基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 GRU网络 4.3 注意力机制&#xff08;Attention&#xff09; 4.4 WOA优化算法 5.算法完整程序工程 1.算法运行效果图…

SwiftUI 5.0(iOS 17.0)触摸反馈“震荡波”与触发器模式趣谈

概览 要想创作出一款精彩绝伦的 App&#xff0c;绚丽的界面和灵动的动画并不是唯一吸引用户的要素。有时我们还希望让用户真切的感受到操作引发的触觉反馈&#xff0c;直击使用者的灵魂。 所幸的是新版 SwiftUI 原生提供了实现触觉震动反馈的机制。在介绍它之后我们还将进一步…

android学习笔记(二)

1、自定义View。 package com.example.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; //可以在View测量和布局完成后…

idea 通过maven构建无法使用@SpringBootApplication

问题描述 SpringBootApplication标红&#xff0c;没有提示&#xff0c;无法启动springboot使用maven构建。通过idea的标准版本构建 原因 springboot构建启动依赖spring-boot-maven-plugin idea的标准版本没有指定构建版本&#xff0c;然后在springboot-parent里面没有指定默…

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

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

Git 仓库内容操作

Git 仓库内容操作 | CoderMast编程桅杆Git 仓库内容操作 添加文件到暂存区 使用如下指令将工作区的文件添加到暂存区&#xff0c;告诉 Git 在下次 commit 时哪些文件做出了修改。 commit 指令详看后续 添加一个或多个文件到暂存区&#xff1a; 添加指定目录到暂存区 添加当前目…

uniapp制作多选下拉框和富文本(短信页面)

实例 多选下拉框实现 http://t.csdnimg.cn/TNmcF 富文本实现 http://t.csdnimg.cn/Ei1iV