模版初阶与STL

news2024/11/26 4:22:36

1.泛型编程

void Swap(int& left, int& right) {
 int temp = left;
 left = right;
 right = temp; }
void Swap(double& left, double& right) {
 double temp = left;
 left = right;
 right = temp; }
void Swap(char& left, char& right) {
 char temp = left;
 left = right;
 right = temp; }

我们看上面这段代码,以前C语言的话,要实现不同类型变量的交换就要写多个函数
但是在C++中就可以告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
模版又分为函数模版和类模版

2.函数模版

template<typename T>
void Swap(T& t1, T& t2)
{
	T tmp = t1;
	t1 = t2;
	t2 = tmp;
}
int main()
{
	int a1 = 0;
	int a2 = 1;
	Swap(a1, a2);
	cout << a1 << ' ' << a2 << endl;
	double b1 = 0.2;
	double b2 = 1.4;
	Swap(b1, b2);
	cout << b1 << ' ' << b2 << endl;
	return 0;
}

直接看代码,这里有两个关键字,为template和typename,他俩的作用主要是将类型命名为T
根据传入参数,来推测T的类型,这个叫做推演
其实并不是只调用的一个函数,而是调用的两个函数,为int时会建立T为int的函数,为double时会建立T为double的函数,这叫函数模版的实例化
所以说这并不会提高效率,麻烦的只是编译器了,但是方便的程序员就可以了
还有就是typename可以用class代替,两个是一样的作用在这里,但不能用struct代替
在这里插入图片描述
这一段代码会出问题主要是因为编译器不知道T是什么类型,你这样传过去,T既可以是int也可以是double,所以编译器会出错
处理方法一:将一个进行强制类型转换

template<typename T>
T Add(const T& t1,const T& t2)
{
	return t1 + t2;
}
int main()
{
	int a1 = 0;
	double a2 = 3.3;
	Add(a1, (int)a2);
	return 0;
}

如图我们将a2这个double类型强制类型转换,因为强制类型转换会生成临时变量,临时变量又具有常性,所以我们要用const修饰,在函数那里,所以说,如果有引用和指针的,如果不修改值的话,还是用const加上吧,不然很容易发生权限的缩小

template<typename T>
T Add(const T& t1,const T& t2)
{
	return t1 + t2;
}
int main()
{
	int a1 = 0;
	double a2 = 3.3;
	Add<int>(a1,a2);
	return 0;
}

在这里插入图片描述

方法二就是显示实例化了,就是在函数名后面,参数前面加上就表示直接认为T为int了,那这样的话,a2这个double类型就会发生隐式类型转换了

template<typename T1,class T2>
auto Add(const T1& t1, const T2& t2)
{
	return t1 + t2;
}
int main()
{
	int a1 = 0;
	double a2 = 3.3;
	cout << Add(a1, a2);
	return 0;
}

在这里插入图片描述
第三种方法就是在定义一个T,多对一个类型命名,那这样就可以根据int推出T1为int,根据为double类型推出T2为double,然后函数返回值不知道为什么好的话就用auto吧,自动判断,因为你不知道T1与T2谁为double,不知道返回谁好

int Add(int a1, int a2)
{
	cout << "int Add(int a1, int a2)" << endl;
	return a1 + a2;
}
template<typename T>
T Add(const T& t1, const T& t2)
{
	cout << "T Add(const T& t1, const T& t2)" << endl;
	return t1 + t2;
}
template<typename T1,class T2>
auto Add(const T1& t1, const T2& t2)
{
	cout << "auto Add(const T1& t1, const T2& t2)" << endl;
	return t1 + t2;
}
int main()
{
	int a1 = 0,a2=9;
	double b1 = 3.3,b2=9.3;
	Add(a1, a2);
	Add(b2, b1);
	Add(a1, b1);
	return 0;
}

在这里插入图片描述
因为模版并不是创建了这个函数,所以模版间是可以同时存在的
这个我们可以看出,函数调用是调用最适合的,同时为int时,因为有现成的,所以就调用这个
同时为double时,调用第二个,第一个也可以调用,但是不适合,因为会发生隐式类型转换
调用第三个也不是最合适的,因为是两个相同的,那就调用相同的就可以了啊
第三个,一个为int,一个为double,那就调用第三个最合适了

int main()
{
	int a1 = 0,a2=9;
	double b1 = 3.3,b2=9.3;
	Add<int,int>(a1, b1);
	Add<int>(b1, a1);
	Add<double>(b1, a1);
	return 0;
}

在这里插入图片描述
可以看出,多个参数的显示实例化,也就是<int,int>了,这个表示将T1,T2都弄为int,因为显示实例化的两个,所以调用第三个
Add(b1, a1);这个嘛,T Add(const T& t1, const T& t2)中的T就直接相当于变为了int,T1变为int,T2未知,这样的话,b1肯定要强制类型转换为int,那么都为int,选第二个呗
实例化就是指定那个T为什么,指定顺序与定义T的顺序一致

3.类模板

所谓类模板,就是对类创建一个模版

class Stack
{
public:
	void Push(int x)
	{
		/
	}
private:
	int* _a;
	int _size;
	int _capacity;
};

如果不是模版的话就是这样的,现在直接变成模版

template<class T>
class Stack
{
public:
	void Push(T x)
	{
		/
	}
private:
	T* _a;
	T _size;
	T _capacity;
};

int main()
{
	Stack<int> s1;
	Stack<double> s2;
	return 0;
}

这个就相当于模版了,只不过调用模版的时候一定要显示实例化,因为这个不像函数,可以根据参数来得出T的类型,当然如果函数也不能根据参数类型来得出T,也只能显示实例化了

4.STL简介

STL叫做标准模板库,里面主要包括数据结构与算法,还包括一些什么内存池,仿函数,迭代器,配接器之类的东西
反正STL很重要

总结

这一节比较简单,主要是给STL开个头,下一节我们讲string,也就是串

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

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

相关文章

Linux系统安装的详细步骤详解

在VM虚拟机上安装Linux系统全过程&#xff0c;闭眼跟着走就行&#xff01;&#xff01;&#xff01; 1、准备好VMware Worestation虚拟机软件和Linux系统的映像文件 2、点击创建新的虚拟机 3、在新建虚拟机向导中&#xff0c;选择典型安装模式。典型安装模式可以通过几个简单的…

简析漏洞生命周期管理的价值与关键要求

开展全面且持续的漏洞管理工作&#xff0c;对于企业组织改善数字化应用安全状况&#xff0c;降低潜在风险&#xff0c;并保持数字资产的完整性和可信度至关重要。做好漏洞管理并不容易&#xff0c;组织不仅需要拥有健全的漏洞管理策略&#xff0c;同时还要辅以明确定义的漏洞管…

VulnHub:tenderfoot1

靶机下载地址 信息收集 主机发现 扫描攻击机同网段存活主机。nmap 192.168.31.0/24 -Pn -T4 目标主机ip&#xff1a;192.168.31.199。 端口扫描 nmap 192.168.31.199 -A -p- -T4 开放了22,80端口&#xff0c;即ssh和http服务。 目录扫描 访问http服务&#xff0c;是apac…

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

WebGIS的Web服务概述

WebGIS是互联网技术应用于GIS开发的产物&#xff0c;是现代GIS技术的重要组成部分&#xff0c;其中的Web服务是现代WebGIS的核心技术和重要标志&#xff0c;它集GIS、程序组件和互联网的优点于一身&#xff0c;深刻改变了GIS开发和应用的方式&#xff0c;绕过了本地数据转换和本…

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…

完美解决Ubuntu的MySQL临时文件夹修改调整

打开终端,输入以下命令$ sudo -i # 切换root用户 $ systemctl stop mysql.service $ mkdir /home/tmp $ chown root:root /home/tmp $ chmod 1777 /home/tmp $ gedit /etc/mysql/mysql.conf.d/mysqld.cnf以上最后一条命令执行完后,在打开的mysqld.cnf文件做如下修改并保存关闭…

栈和队列(C语言)

栈的定义 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

【Python正则表达式】:文本解析与模式匹配

文章目录 1.正则表达式2. re模块3.修饰符3.元字符3-1 字符匹配元字符3-2 重复次数限定元字符3-3 字符集合匹配元字符3-4 分组元字符3-5 边界匹配元字符3-6 字符类别匹配元字符 4.技巧4-1 贪婪与非贪婪 5.案例 1.正则表达式 正则表达式面向什么样的问题&#xff1f; 1、判断一个…

平衡三进制计算机模拟2

1、计算机的起源 在19世纪的时候&#xff0c;“Computer”代表的并不是计算机&#xff0c;而是计算员&#xff0c;那时并没有计算机的概念&#xff0c;而计算员当然是要计算东西的&#xff0c;当时计算东西多&#xff0c;计算水平也参差不齐&#xff0c;加上疲劳等因素&#xf…

华夏银行的进和退:不良率位列同业第一,分红比例常年不达标

撰稿|芋圆 来源|贝多财经 近日&#xff0c;华夏银行股份有限公司&#xff08;SH:600015&#xff0c;下称“华夏银行”&#xff09;北京分行联合北京产权交易所举办了特殊资产推介会。会上&#xff0c;华夏银行包括北京分行在内的7家分行和信用卡中心&#xff0c;共同推介了超…

从操作系统层面认识Linux

描述进程-PCB Linux操作系统下的PCB是: task_struct https://www.cnblogs.com/tongyan2/p/5544887.htmlhttps://www.cnblogs.com/tongyan2/p/5544887.html校招必背操作系统面试题-什么是 PCB&#xff08;进程控制块&#xff09; &#xff1f;_哔哩哔哩_bilibili校招必背操作系…

汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

汉明权重&#xff08;Hamming Weight&#xff09;&#xff08;统计数据中1的个数&#xff09;VP-SWAR算法 定义 汉明重量是一串符号中非零符号的个数。它等于同样长度的全零符号串的汉明距离(在信息论中&#xff0c;两个等长字符串之间的汉明距离等于两个字符串对应位置的不同…

浏览器插件利器--allWebPluginV2.0.0.16-beta版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

刷题了:242.有效的字母异位词 |349. 两个数组的交集 | 202. 快乐数|1. 两数之和

学习记录&#xff0c;主要参考&#xff1a;代码随想录 哈希表理论基础 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 哈希表&#xff08;Hash table&#xff09; 哈希表是根据关键码的值而直接进行访问的数据…

deepseek-vl 论文阅读笔记

目录 一、已有模型性能差距分析 二、创新点 数据集构建 模型架构 训练策略 实验与评估 三、细节 数据构建 内部SFT数据的分类体系 模型架构 训练流程包括三个阶段 系统包含三个模块 混合视觉编码器 视觉-语言适配器 语言模型 训练策略 阶段一&#xff1a;训练…

nfs和web服务器的搭建

&#xff08;一&#xff09;web服务器的搭建 1.配置基本环境 要点有&#xff0c;yum源&#xff0c;包含nginx和阿里云&#xff08;或者腾讯云或者华为云&#xff09;&#xff0c;这里的相关知识可以参考之前的yum配置笔记 2.安装nginx yum -y install nginx 3.验证并且开启服…

MLCC电容特性及注意事项

MLCC结构和工作原理 如下图所示&#xff0c;MLCC电容结构较简单&#xff0c;由陶瓷介质、内电极金属层和外电极三层构成。 MLCC的电容量公式可以如下表示&#xff1a; C&#xff1a;电容量&#xff0c;以F&#xff08;法拉&#xff09;为单位&#xff0c;而MLCC之电容值以PF&…

AWE2025正式启动,AWE×AI 推动智慧生活的普及

7月18日&#xff0c;2025年中国家电及消费电子博览会&#xff08;AWE2025&#xff09;正式启动。主办方宣布&#xff0c;AWE2025的主题为“AI科技、AI生活”&#xff0c;展会将于2025年3月20-23日在上海新国际博览中心举办。 作为全球三大家电和消费电子领域展会之一&#xff…