C++--模板

1 泛型编程

如何将Swap实现乘成一个通用的交换函数

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;
}

可以看出三个Swap函数相似度极大,而且俩传入参数类型相同,这时候可以利用模板关键字template就能将传入类型抽象出来通用。

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

将多个类似只是类型不同的函数都可以利用模板将其通用化,类型不同可以表现在传入参数类型不同,返回值类型不同等。

模板分类

1 函数模板

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

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

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。简单说就是编译预处理的时候就会将调用的函数模板转换出调用类型的函数代码,意思就是编译器会自动为我们生成所需的调用函数的代码,模板本质上是替换。

函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。

模板参数实例化分为:隐式实例化和显式实例化。

隐式实例化:编译器自动推导T为什么类型

显式实例化:用<>指定T的类型

模板参数匹配

同名的模板函数和非模板函数可以同时存在,而且该模板函数也可以实例化为这个非模板函数。

但调用的时候有所区别。

 3 类模板

类模板定义格式

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

模拟实现vecotor部分功能

#include <iostream>
#include <assert.h>
#include <string>
using namespace std;
template <class T>
class vector
{
public: //不能省 省了就会报错。vector():_a(nullptr),_size(0),_capacity(0){}~vector(){delete[] _a;_a = nullptr;_size = 0;_capacity = 0;}size_t size(){return _size;}T& operator[](size_t i) //传值返回是临时拷贝,属于常量不可修改,如果需要对返回值进行修改需要传引用{assert(i < _size);return _a[i];}void Push_Back(const T &x);void Pop_Back();
private:T* _a;size_t _size;size_t _capacity;
};
template<class T>
void vector<T>::Push_Back(const T& x)
{if (_size == _capacity){size_t newcapacity = (_capacity == 0 ? 2 : _capacity * 2);T* temp = new T[newcapacity];if (_a){memcpy(temp, _a, sizeof(T) * _size);delete[] _a;}_a = temp;_capacity = newcapacity;}_a[_size] = x;_size++;
}
template <class T>
void vector<T>::Pop_Back()
{assert(_size > 0);_size--;
}int main()
{vector<int> v;v.Push_Back(1);v.Push_Back(2);v.Push_Back(3);for (size_t i = 0; i < v.size(); i++){v[i] *= 2;}for (size_t i = 0; i < v.size(); i++){cout << v[i];}return 0;
}

类模板实例化

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

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

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

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

相关文章

Docker 的安装和使用

参考资料&#xff1a; 通俗易懂了解什么是docker?Docker 教程 | 菜鸟教程Ubuntu 22.04 安装 DockerDocker 超详细基础教程WSL2 支持 systemctl 命令systemd 和 systemctl 是什么&#xff1f;使用正确的命令重启 WSL 子系统Ubuntu 修改源镜像方法Docker 中出现 ‘/etc/resolv.…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…

【网络安全】-文件上传漏洞

文件操作漏洞包括文件上传漏洞&#xff0c;文件包含漏洞&#xff0c;文件下载漏洞。 文章目录 前言 什么是文件上传漏洞&#xff1f; 文件上传的验证与绕过&#xff1a; 1.前端js验证&#xff1a;   Microsft Edge浏览器&#xff1a; Google Chrome浏览器&#xff1a; 2.后端…

LeetCode之常用函数

收集了 LeetCode 面试经典150 & LeetCode 热题100中常用的函数与技巧 LeetCode之数组/字符串 地址链接 public static void main(String[] args) {// 1. 数组排序int[] array new int[]{3, 7, 5, 2};Arrays.sort(array);// 结果: [2, 3, 5, 7]System.out.println(Arrays.…

【video clips 专栏 2 -- videopad 视频拼接】

文章目录 常用视频剪辑工具推荐videopad 视频拼接如何在 VideoPad 中并排放置两个视频 转自&#xff1a;https://www.imangodoc.com/CHxTwkIj.html 常用视频剪辑工具推荐 请阅读&#xff1a;https://www.videosoftdev.com/cn/free-video-editing-software-no-watermark vide…

Linux 基础命令-文件与目录操作

在 Linux 操作系统中&#xff0c;文件和目录是组织和管理数据的核心单元。作为一个命令行驱动的操作系统&#xff0c;Linux 提供了一系列强大且灵活的命令来操作文件和目录。掌握这些命令不仅是管理 Linux 系统的基础&#xff0c;也是高效使用 Linux 环境的关键。 一、文件与目…

Taro实现微信小程序自定义拍照截图识别

效果图&#xff1a; 代码&#xff1a; <template><view class"lary-top" :style"{ height: ${topBarHight}px }"></view><Camerav-show"!canvasShow"class"camera-photo":style"{width: ${info.windowWidt…

LIO-SAM如何保存地图

一、找到LIO-SAM配置文件&#xff0c;路径为config/params.yaml&#xff0c;修改以下两项参数&#xff1a; savePCD: true # https://github.com/TixiaoShan/LIO-SAM/issues/3savePCDDirectory: "/home/slam/catkin_ws/src/maps" …

Http带消息头两种请求办法

API接口最近经常碰到&#xff0c;协调几个乙方来回对接&#xff0c;把我折腾晕了&#xff0c;索性自己写一个小的工具&#xff0c;导入历史数据。 获取平台免登录token 接口说明 URL Path&#xff1a;gateweb/bigm-dm/openApi/ologin/openLogin 说明&#xff1a;第三方免登…

Java架构师实战篇Redis亿级数据统计方案

目录 1 Redis亿个keys数据统计方案2 Redis聚合统计(SUNIONSTORE)3 Redis排序统计(LRANGE)4 值状态统计(bitmap)4.1 位图简介4.2 应用场景4.3 常用的命令4 基数统计(SADD)5 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 Redis亿个keys数据统计方案 在 Web 和移动…

Spring Cloud Gateway中的常见配置

问题 最近用到了Spring Cloud Gateway&#xff0c;这里记录一下这个服务的常见配置。 spring:data:redis:host: ${REDIS_HOST:xxx.xxx.xxx.xxx}port: ${REDIS_PORT:2345wsd}password: ${REDIS_PASS:sdfsdfgh}database: ${REDIS_DB:8}session:redis:flush-mode: on_savenamespa…

.NET 一款用于解密web.config配置的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

SpringBoot2:请求处理原理分析-接口参数解析原理(argumentResolvers)

一、知识回顾 我们知道&#xff0c;接口的参数&#xff0c;一般都要配上注解来一起使用。 不同的参数注解&#xff0c;决定了传参的方式不同。 为什么会这样&#xff1f; 如果让你设计接口参数解析&#xff0c;你会怎么做&#xff1f; 首先&#xff0c;我们知道方法参数是形…

软件设计基础知识(5)

1.Cache与主存的地址映像需要专门的硬件自动完成&#xff0c;使用硬件来处理具有更高的转换速率。 2.指令寄存器用来存放当前正在执行的指令&#xff0c;对用户是完全透明的。 3.构造哈夫曼树的过程是首先从给出的权值集合中找出最小的两个权值。 4.PC(程序计数器) AR(地址寄…

Spring动态调用定时任务

Map<定时多久,List<方法>> map 动态定时任务 需求 使用一个结构来管理定时任务&#xff0c;其中每个时间间隔对应一组方法。这些方法需要在指定的时间间隔内执行。具体来说&#xff0c;维护一个 Map&#xff0c;键是定时的间隔&#xff08;以秒为单位&#xff09…

机器学习之监督学习(三)神经网络

机器学习之监督学习&#xff08;三&#xff09;神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一&#xff1a;TensorFlow搭建神经网络 4. 反向传播梯度下…

开源的 Windows 12 网页体验版!精美的 UI 设计、丰富流畅的动画

大家周二好呀&#xff01;博主今天给小伙伴们分享一款炫酷的 Windows 12 体验版&#xff0c;网页效果拉满&#xff0c;非常值得我们去尝试&#xff01; 如果你对未来的Windows操作系统充满期待&#xff0c;那么这款开源的Windows 12 网页体验版绝对不容错过&#xff01;这不仅…

consul配置ACL安全认证

文章目录 前言一、漏洞详情二、漏洞处理1.ACL相关介绍2.开启ACL3.创建令牌4.修改acl文件5.修改单节点consul启动配置文件6.重启consul 三、漏洞处理结果验证 前言 因为现阶段属于护网期,因此公司对服务器、业务的安全都很关注,只要再次期间被漏扫出来的漏洞&#xff0c;都需要…

tomcat是不是已经被Springboot集成了?

Tomcat 确实已经被 Spring Boot 集成。Spring Boot 通过其独特的“starter”模块&#xff08;如spring-boot-starter-web&#xff09;实现了对Tomcat的自动配置。当在Spring Boot项目中引入这个starter时&#xff0c;会自动引入相关的依赖&#xff0c;包括tomcat-embed-core、t…

C语言补习课——文件篇

来源&#xff1a;黑马程序员 第157讲 C语言操作文件概述 读取文件&#xff1a;输入流 写文件&#xff1a;输出流 读写的方向判断取决与参照&#xff0c;一般我们站在程序的角度判断读写方向。 第158讲 路径 基本概念 路径就是指文件在电脑中的位置&#xff0c;eg&#xf…