【C++第六课 - 模板、STL简介、string】函数模板、类模板、STL简介

news2024/10/7 2:25:38

目录

  • 模板
    • 函数模板
      • 函数模板概念
      • 函数模板格式
      • 实例化
        • 推演实例化
        • 显示实例化
    • 类模板
  • STL简介

模板

在这里插入图片描述

函数模板

函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本。

函数模板格式

template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
#include<iostream>
using namespace std;

template<typename T>
void Swap(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}

int main()
{
	int a = 1;
	int b = 2;
	Swap(a, b);
	cout << "a:" << a << "b:" << b;
	return 0;
}

typename是关键字,其也可以用class替代
注意:class不可以用struct替代

实例化

推演实例化

通过实参去推形参类型的构成 – 模板的推演
在这里插入图片描述
根据推演的类型去生成特定的函数 – 模板的实例化
在这里插入图片描述

显示实例化
template<typename T>
T Add(T left, T right)
{
	return left + right;
}

int main()
{
	cout << Add(1, 2) << endl;
	cout << Add<int>(1, 2.1) << endl;
	cout << Add<double>(1, 2.1) << endl;
	return 0;
}

在这里插入图片描述

如果是两个模板类型
Add<int, double>(1, 2.1)

显示实例化使用场景

template<typename T>
T* F(int n)
{
	T* p = new T[n];
	return p;
}

int main()
{
	double* p = F<double>(10);
	return 0;
}

模板参数不涉及形参部分
普通函数和函数模板能否同时存在

编译器的调用原则:
1、如果有现成的先调用现成的
2、有更合适的就调用更合适的,没有就将就调用(如果没有函数模板那个Add,对于Add(1.1, 2.2)就将就去掉int那个Add)

int Add(int left, int right)
{
	return left + right;
}

template<typename T, typename Y>
T Add(T left, Y right)
{
	return left + right;
}

int main()
{
	int a = Add(1, 2);
	double b = Add(1.1, 2.2);
	return 0;
}

类模板

引入
虽然typedef可以解决一部分问题,但是如果a想存int,b想存double就无法解决了 – 这时候就用到类模板了

typedef int StackDateType;
class Stack
{
public:
	Stack(int capacity)
	{
		_a = new StackDateType[capacity];
		_capacity = capacity;
		_top = 0;
	}
	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_capacity = 0;
		_top = 0;
	}
private:
	StackDateType* _a;
	int _capacity;
	int _top;
};

int main()
{
	Stack a(10);
	Stack b(10);

	return 0;
}

用法
对于类模板来说,只能显示实例化
函数模板可以推演实例化、显示实例化

template<class T>
class Stack
{
public:
	Stack(int capacity)
	{
		_a = new T[capacity];
		_capacity = capacity;
		_top = 0;
	}
	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_capacity = 0;
		_top = 0;
	}
private:
	T* _a;
	int _capacity;
	int _top;
};

int main()
{
	Stack<int> a(10);
	Stack<double> b(10);

	return 0;
}

普通类:类名就是类型
类模板实例化的类:类名不是类型,==类名<数据类型>==才是整个类的类型
显示实例化的类型不同,他们就是不同的类

类模板的声明和定义分离

template<class T>
class Stack
{
public:
	Stack(int n = 4);
	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_capacity = 0;
		_top = 0;
	}
private:
	T* _a;
	int _capacity;
	int _top;
};

template<class T>
Stack<T>::Stack(int n = 4)
	{
		_a = new T[capacity];
		_capacity = capacity;
		_top = 0;
	}

int main()
{
	Stack<int> a(10);
	Stack<double> b(10);

	return 0;
}

类模板不允许声明和定义写到不同的文件,会产生链接问题

STL简介

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

C++标准库还包括:IO流库、智能指针库、异常相关的库。

在这里插入图片描述
容器:数据结构
空间配置器:内存池,专门给数据结构提供内存,数据结构需要内存的时候不是去new,而是找内存池
配接器:又叫适配器

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

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

相关文章

如何用二维码实现现代仓库管理?

随着科技的进步&#xff0c;二维码技术逐渐应用与各个领域&#xff0c;其中在仓库管理中的应用也日益广泛。 那话不多说&#xff0c;我们直接来看如何用二维码实现现代仓库管理 简道云仓库管理模板&#xff0c;可以点击安装配合阅读&#xff1a;https://www.jiandaoyun.com 二…

【JAVA进阶篇教学】第七篇:Spring中常用注解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第七篇&#xff1a;Spring中常用注解 在Java Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息&#xff0c;这些信息可以用于编译时检查、运行时…

裸金属服务器使用效果好吗

在当今的数字化时代&#xff0c;信息技术的飞速发展&#xff0c;云计算技术已经成为企业信息化建设的重要基石。在众多计算资源中&#xff0c;裸金属和云服务器是两种主流的服务模式&#xff0c;它们各有千秋&#xff0c;为不同的用户需求提供了适合的解决方案。而裸金属服务器…

【EMQX】使用websocket订阅EMQX数据

需求&#xff1a;某平台希望通过 websocket 来订阅 EMQX平台上的某些 Topic数据进行处理 1、EMQX 服务配置 前提是EMQX服务正常安装运行了&#xff0c;如果EMQX服务未安装的话&#xff0c;详见以下文章关于如何安装部署服务&#xff1a; 搭建自己的MQTT服务器、实现设备上云(W…

PC-3000 Mobile Pro: 智能手机及平板设备数据提取及取证工具

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

【Redis 开发】详细搭建Redis主从,并了解数据同步原理

Redis主从搭建 Redis主从搭建Redis的主从架构数据全同步原理数据的增量同步优化Redis主从集群 Redis主从 搭建Redis的主从架构 主从节点可以实现读写分离&#xff0c;将都大量的读操作分担与诸多从节点当中去 从节点可以叫做slave或者replica 如何搭建&#xff1a; 在一台…

LeetCode 104.二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,…

20240425在Ubuntu20.04下检测HDD机械硬盘

20240425在Ubuntu20.04下检测HDD机械硬盘 2024/4/25 14:28 百度&#xff1a;免费 HDD 机械硬盘坏道检测 ubuntu HDD机械硬盘 坏道检测 https://blog.csdn.net/anny0001/article/details/136001767 ubuntu 坏道扫描 Mystery_zero 已于 2024-02-02 22:20:46 修改badblocks -b 819…

yo!这里是网络入门初识

目录 前言 基本概念 网络 协议 地址 网络传输流程 OSI七层模型 TCP/IP四层&#xff08;五层&#xff09;模型 流程图 数据封装&&分用 后记 前言 对于上一个专栏——Linux操作系统&#xff0c;我们学习了操作系统的基础知识以及基本的系统编程&#xff0c;其…

企业计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密工具

随着网络技术在企业中的不断应用&#xff0c;越来越多的企业离不开网络&#xff0c;通过网络数字化办公模式&#xff0c;可以为企业提高生产运营效率&#xff0c;大大提高了企业发展水平&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业…

Opencv | 直方图

这里写目录标题 一. 直方图方法1方法2方法3 二. 掩码区域的直方图绘制三. 直方图均衡化 一. 直方图 方法1 cv.calcHist(images, channels, mask, histSize, rangesNone, accumulateFalse)参数:images: 输入图像&#xff0c;可以是单个图像或图像的列表channels: 计算直方图的通…

Meta-Llama-3-8B-Instruct本地推理

Meta-Llama-3-8B-Instruct 本地推理 基础环境信息&#xff08;wsl2安装Ubuntu22.04 miniconda&#xff09; 使用miniconda搭建环境 (base) :~$ conda create --name pytorch212 python3.10 Retrieving notices: ...working... done Channels:- defaults Platform: linux-64 C…

清新优雅、功能强大的后台管理模板 | 开源日报 No.238

soybeanjs/soybean-admin Stars: 7.0k License: MIT soybean-admin 是一个基于 Vue3、Vite5、TypeScript、Pinia、NaiveUI 和 UnoCSS 的清新优雅且功能强大的后台管理模板。 使用最新流行的技术栈&#xff0c;如 Vue3、Vite5 和 TypeScript。采用清晰的项目架构&#xff0c;易…

SRAM控制原理与读写实例

本文对SRAM进行介绍&#xff0c;并对其内部的存储器矩阵、地址译码器、列I/O及I/O数据电路、控制电路、SRAM的读写流程进行简要介绍&#xff0c;并给出SRAM IS62LV256-45U读写实例。 文章目录 存储容量的计算SRAM控制原理SRAM信号线存储器矩阵地址译码器、列I/O及I/O数据电路控…

开发总结-Dao层(Mapper层)

Mybatis-plus新用法 VehicleBO one vehicleService.getOne(Wrappers.<VehicleBO>lambdaQuery().eq(VehicleBO::getVin, reqVo.getVin()));boolean b bizAccountApplyService.remove(Wrappers.<BizAccountApplyBO>lambdaQuery().eq(BizAccountApplyBO::getId, 14…

工业级PDA手持机,信息时代的便捷工具

在当今信息快速发展的时代&#xff0c;各种先进技术不断涌现&#xff0c;为各个行业带来了巨大的变革和提升。工业级 PDA 手持机作为一种集多种功能于一身的便捷工具&#xff0c;正逐渐成为工业领域中不可或缺的一部分。 工业级 PDA 手持机是一种专门为工业应用设计的便携式数据…

提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票

引言 五一假期作为中国的传统节日&#xff0c;也是旅游热门的时段之一&#xff0c;特价机票往往成为人们关注的焦点。在这个数字化时代&#xff0c;利用爬虫技术获取特价机票信息已成为一种常见的策略。通过结合C#和Fizzler库&#xff0c;我们可以更加高效地实现这一目标&…

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现 摘要&#xff1a; 随着汽车电子技术的快速发展&#xff0c;车辆状态实时监控系统的需求日益增长。本文设计并实现了一种基于STM32单片机的汽车胎压、速度及状态监测系统。该系统能够实时监测汽车的胎压、速度以及其他…

Three.js杂记(十三)—— 包围盒

好久没有学习three.js了&#xff0c;现在再重新巩固并深入学习。荒废学习一年多了&#xff0c;希望现在为时未晚&#x1f4aa; 包围盒 包围盒按照字面理解就是包围一个物体的盒子&#xff0c;那就是一个长方形空间。 一般来说&#xff0c;包围盒可以用于&#xff1a; 物体之…

Redis__数据类型

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__数据类型 ⏱️ 创作时间&#xff1a;2024年04月28日 ———————————————— 这里写目录标题 文…