C++ 复习总结记录六

C++ 复习总结记录六

模板初阶主要内容

1、泛型编程

2、函数模板

3、类模板

4、STL 简介

一 泛型编程

如何实现一个通用的交换函数

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

使用函数重载虽然可以实现功能,但重载函数仅是类型不同,代码复用率低,只要有新类型出现时,需要增加对应函数;且代码可维护性比较差

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础

二 函数模板

2.1 概念

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

函数模板格式

template<typename T1, typename T2, ... ,typename Tn>

返回值类型 函数名(参数列表) {}

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

注意:typename 是用来定义模板参数关键字**,**也可以使用 class (不能使用 struct 代替 class )

2.2 原理

函数模板是一个蓝图,它本身并不是函数,是编译器根据调用类型产生特定具体类型函数的模具

image-20250108223639780

在编译器编译阶段,对于模板函数的使用,编译器根据传入实参类型生成对应类型的函数以供调用(预处理阶段生成对应特定函数)

2.3 函数模板实例化

用不同类型参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化

1、 隐式实例化:编译器根据实参推导模板参数实际类型

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);/*该语句不能通过编译, 在编译期间, 编译器推导实参类型 a1 将 T 推演为 int,通过实参 d1 将 T 推演为 double 类型, 但模板参数列表中只有一个 T. 注意:在模板中, 编译器一般不会进行类型转换操作Add(a1, d1);*/// 两种处理方式: 1.强制转化 2.使用显式实例化Add(a, (int)d);return 0;
}

2、显式实例化:在函数名后的 <> 中指定模板参数实际类型

int main(void)
{int a = 10;double b = 20.0;// 显式实例化Add<int>(a, b);return 0;
}

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错

2.4 模板参数匹配原则

1、非模板函数可以和同名函数模板同时存在,且该函数模板还可被实例化为该非模板函数

// 专门处理 int 的加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T>
T Add(T left, T right)
{return left + right;
}void Test()
{Add(1, 2); // 与非模板函数匹配, 编译器不需要特化Add<int>(1, 2); // 调用编译器特化 Add 版本
}

2、对于非模板函数和同名函数模板,若其它条件都相同,调用时会优先调用非模板函数而不会从该模板产生出一个实例。若模板可产生一个更匹配的函数, 那么将选择模板

// 专门处理 int 加法函数
int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{return left + right;
}
void Test()
{Add(1, 2);  //与非函数模板类型完全匹配, 不需要函数模板实例化Add(1, 2.0); //模板函数可以生成更匹配版本, 编译器根据实参生成更匹配的 Add 函数
}

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

三 类模板

3.1 类模板定义格式

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

动态顺序表

// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{ 
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}~Vector();void PushBack(const T& data);void PopBack();// ...size_t Size() {return _size;}T& operator[](size_t pos){assert(pos < _size);return _pData[pos];}private:T* _pData;size_t _size;size_t _capacity;
};// 注意: 类模板中函数放在类外进行定义时, 需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{if(_pData)delete[] _pData;_size = _capacity = 0;
}

3.2 类模板实例化

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

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

四 STL 简介

4.1 STL 是什么

STL ( standard template libaray - 标准模板库 ),是 C++ 标准库的重要组成部分,是一个包罗数据结构与算法的软件库

STL 版本

【原始版本】Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费,唯一条件是也需要向原始版本一样做开源使用。 HP 版本 – 所有 STL 实现版本的起源

【P. J. 版本】由 P. J. Plauger 开发,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名怪异

【RW 版本】由 Rouge Wage 公司开发,被 C+ + Builder 采用,不能公开或修改,可读性一般

【SGI 版本】由 Silicon Graphics Computer Systems,Inc 公司开发,被 GCC(Linux) 采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,可读性强

4.2 STL 六大组件

image-20250108230740268

4.3 STL 缺陷

1、STL 库更新太慢了,上一版是 C++98,中间 C++03 基本一些修丁。C++11 出来后相隔了十几年,STL才 进一步更新

2、STL 现在都没有支持线程安全,并发环境下需要自行加锁,且锁粒度比较大

3、STL极度追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取

4、STL 使用会有代码膨胀问题,比如使用 vector 这样会生成多份代码,当然这是模板语法本身导致的

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

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

相关文章

Leecode刷题C语言之字符串中最大的3位相同数字

执行结果:通过 执行用时和内存消耗如下&#xff1a; char* largestGoodInteger(char* num) {int n strlen(num);char* res NULL;for (int i 0; i < n - 2; i) {if (num[i] num[i 1] && num[i 1] num[i 2]) {if (res NULL || strncmp(&num[i], res, 3)…

《繁星路》V1.8.3(Build16632266)官方中文学习版

《繁星路》官方中文版https://pan.xunlei.com/s/VODae2_2Z3QyMF02I5y321uHA1?pwdqgsh# 作为一款星际模拟游戏&#xff0c;完美融合了硬科幻元素与基地建设玩法&#xff0c;体验改造行星的恢弘与壮阔。化身人工意识AMI&#xff0c;遵照基本指示推进火星改造的各项工作&#xf…

《Spring Framework实战》9:4.1.4.依赖注入

欢迎观看《Spring Framework实战》视频教程 典型的企业应用程序不是由单个对象&#xff08;或Spring术语中的bean&#xff09;组成。即使是最简单的应用程序也有几个对象协同工作&#xff0c;以呈现最终用户所认为的连贯应用程序。下一节将解释如何从定义多个独立的bean定义到一…

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值&#xff0c;并显示在 LCD1602 上&#xff1b; 2. 按键修改阈值&#xff0c;并显示在 LCD1602 上&#xff1b; 3. 烟雾值超过阈值时&#xff0c;蜂鸣器长响&#xff0c;风扇打开&#xff1b;烟雾值小于阈值时&#xff0c;蜂鸣器不响…

云安全博客阅读(三)

WAF强固之盾&#xff1a;机器学习赋能下的语义分析 WAF 中&#xff0c;传统的基于正则的检测方法依赖正则的运营更新&#xff0c;以不断防护新的攻击方法&#xff1b; 主要流程为&#xff1a;HTTP包 -> payload解码 -> 正则匹配 但是&#xff0c;攻击者可以通过修改攻…

个人博客搭建(二)—Typora+PicGo+OSS

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; 做个超努力的小奚-CSDN博客 一、前言 博客搭建完一直没有更新&#xff0c;因为WordPress自带的文档编辑器不方便&#xff0c;以前用CSDN写作的时候&#xff0c;习惯了Typora。最近对比了…

spring boot 集成 knife4j

1、knife4j介绍以及环境介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装&#xff0c;使用方式也和Springfox一致&#xff0c;只是对接口…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

KCP解读:C#库类图

本文是系列文章中的一篇&#xff0c;内容由浅到深进行剖析&#xff0c;为了方便理解建议按顺序一一阅读。 KCP技术原理 KCP解读&#xff1a;基础消息收发 KCP解读&#xff1a;重传机制 KCP解读&#xff1a;滑动窗口 KCP解读&#xff1a;拥塞控制 本系列的源码基于https://gith…

Nginx:Stream模块

什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分&#xff0c;负责主要生产流程的控制与数据处理&#xff1b;而在特定生产环节&#xff0c;由于历史设备遗留或工艺配套需求&#xff0c;存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务&#xff0c;一开始是经纬度显示的。 2、右键地图&#xff0c;选择需要调整的投影坐标&#xff0c;这里选择坐标如下&#xff1a; 3、点击确定后&#xff0c;就可以调整成米单位的了。 4、切换后结果如下&#xff1a; 如有需要&#xff0c;可调整成…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…

【linux系统之redis6】redisTemplate的使用方法

新版本的application.yml配置文件 spring:data:redis:host: 192.168.1.102port: 6379lettuce:pool:max-active: 8min-idle: 1max-idle: 0max-wait: 100redisTemplate使用方法 <dependencies><dependency><groupId>org.springframework.boot</groupId>…

【算法】字符串算法技巧系列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a;字符串相关算法技巧 1&#xff1a;字符串转数组 2&#xff1a;子字符串 3&#xff…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

leetcode 5. 最长回文子串

题目如下 本题可以这么来想设有一个回文串s"112211"当我们去掉左右两边的"1"时s任然是回文串。 反过来说现有字符串 "x1221y"(x,y都是未知字符)当且仅当x y时这个字符串是回文串。 故我们可以令i j为某一个字符串的左右两端然后有如下情况: i…

BoltzGnu Boltztrap数据绘图脚本

BoltzGnu包含四个Gnuplot脚本&#xff0c;允许绘制BoltzTraP输出数据。 下载网址&#xff1a; https://github.com/K4ys4r/BoltzGnu 1. pTRACE_E.gp -> To plot Trasport proporties as a function of energy at define Temperature2. pTRACE_E_multT.gp -> To pl…