【C++】模版初阶以及STL的简介

个人主页~
模版及STL
- 一、模版初阶
- 1、泛型编程
- 2、函数模版
- (1)概念
- (2)函数模版格式
- (3)函数模版的原理
- (4)函数模版的实例化
- ①显式实例化
- ②隐式实例化
- (5)模版参数的匹配原则
- 3、类模版
- (1)类模板的定义格式
- (2)类模板的实例化以及类函数的使用
- 二、STL简介
一、模版初阶
1、泛型编程
我们在先前的博文中提到过函数重载交换函数swap,但是使用函数重载有几个不好的地方:
1、重载的函数仅仅是类型不同,代码复用率比较低,所有的重载函数中只有数据类型不同,其他的都基本相同, 只要有新类型出现就需要用户自己增加对应的函数
2、代码可维护性低,其中某一函数出错可能会导致所有重载都出错
解决这个问题的方法就是有一个模具,只要相同的就直接套用,不同的替换就可以了
泛型编程就是编写与类型无关的通用代码,是代码复用的一种手段,模版是泛型编程的基础
2、函数模版
(1)概念
函数模版代表了一个函数家族,该函数模版与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
(2)函数模版格式
template<typename T1,typename T2,...>
type name ()
{}
template就是一个函数模版关键字后跟<>,参数放里边
typename是一个类类型参数,也可以写成class,但不能写成struct,它代表name函数可以操作的数据类型。当调用name函数时,编译器会根据传递给函数的实参类型来推断T的具体类型
type name(){}就是一个函数
具体看这个例子:
template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}
(3)函数模版的原理
模版是编译器用使用方式产生特定具体类型函数的模具,它本身并不是函数,所以模版就是将本来应该由我们做的重复的事情交给了编译器
在编译器的编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用,将T确定为某一具体类型,然后产生一份专门处理该类型的代码
(4)函数模版的实例化
用不同类型的参数使用函数模版时,称为函数模版的实例化,分为显式实例化和隐式实例化
①显式实例化
template<typename T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int a = 10;double b = 20.0;// 显式实例化Add<int>(a, b);return 0;
}
格式:函数名+<数据类型>(参数)
②隐式实例化
template<typename 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);//意味着T实例化为intAdd(d1, d2);//意味着T实例化为doublereturn 0;
}

这是当两个参数类型相同的时候,如果两参数类型不同该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型,通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错,所以我们要进行手动强制类型转换


注意:在模板中,编译器一般不会进行类型转换操作
(5)模版参数的匹配原则
①一个非模版函数可以和一个同名的函数模版同时存在,而且该函数模版还可以被实例化为这个非模版函数
int Add(int left, int right)
{return left + right;
}template<typename T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{cout << Add(1, 2) << endl;//直接与非模版函数相匹配,编译器不需要进行特化cout << Add<int>(1, 2) << endl;//调用编译器特化的Add版本return 0;
}

调试结果:




②对于非模版函数和同名函数模版,如果其他条件都相同,在调动时会优先调用非模版函数而不会从该模版产生出一个实例,但如果模版可以产生一个具有更好的匹配的函数,那么将选择模版
int main()
{Add(1, 2);//非模版更匹配,会直接选择非模版函数,不必再特化Add(1, 2.0);//模版生成的函数比非模版函数更加匹配,这样就会选择模版return 0;
}
③普通函数可以进行自动类型转换,模版函数不允许自动类型转换
3、类模版
(1)类模板的定义格式
template<class T1, class T2, ..., class Tn>
class name
{// 类内成员定义
};
name是类模板名
接下来我们写一个动态顺序表的模版
template<class T>
class Vector//Vector是类模版名,不是类
{
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}
//模版外定义函数~Vector();void PushBack(const T& data);
//模版内定义函数void PopBack(){_size--;}size_t Size(){return _size;}private:T* _pData;size_t _size;size_t _capacity;
};
// 类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{if (_pData)delete[] _pData;_size = _capacity = 0;
}
//每次函数定义都要加模版参数列表
template <class T>
void Vector<T>::PushBack(const T& data)
{if (_size == _capacity){size_t newcapacity = _capacity * 2;T* ptr = new T[newcapacity];for (int i = 0; i < _size; i++){ptr[i] = _pData[i];}delete[] _pData;//用delete[]回收new[]申请的空间_pData = ptr;_capacity = newcapacity;}_pData[_size] = data;_size++;
}
(2)类模板的实例化以及类函数的使用
类模板实例化需要在类模板名字后加<>,然后将实例化的类型放在里边,类模板不是类,实例化后才为类
int main()
{Vector<int> s1;s1.PushBack(1);s1.PushBack(2);s1.PushBack(3);s1.PushBack(4);s1.PopBack();cout << s1.Size() << endl;Vector<double> s2;return 0;
}

调试结果:


二、STL简介
STL是标准库的组成部分,是一个可复用的组件库和包罗数据结构与算法的软件框架
STL有四个版本,分别是惠普版本(也叫原始版本)、P.J.版本(VC)、RW版本、SGI版本(Linux)
STL由容器、算法、仿函数、空间配置器、迭代器、配接器六大组件构成
STL的产生是C++的一次巨变,它使得很多底层的数据结构及算法不用再让程序员来实现,大大提高了学习和工作的效率和开发产品的进度
当然,STL也有更新慢、不支持线程安全、内部复杂、代码膨胀等问题
今日分享到此结束~

相关文章:
【C++】模版初阶以及STL的简介
个人主页~ 模版及STL 一、模版初阶1、泛型编程2、函数模版(1)概念(2)函数模版格式(3)函数模版的原理(4)函数模版的实例化①显式实例化②隐式实例化 (5)模版参…...
51单片机学习(4)
一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程,模块化编程之后要对其进行注释,以便之后使用模块化函数,对模块化.c文件中的每一个函数进行注释。 注意:一个函数不能既在主函数又在中断函数中 模式1最常用…...
3D问界—MAYA制作铁丝栅栏(透明贴图法)
当然,如果想通过建立模型法来实现铁丝栅栏的效果,也不是不行,可以找一下栅栏建模教程。本篇文章主要是记录一下如何使用透明贴图来实现创建铁丝栅栏,主要应用于场景建模,比如游戏场景、建筑场景等大环境,不…...
编译器对C++23的支持程度
详见这里...
k8s核心操作_存储抽象_K8S中使用Secret功能来存储密码_使用免密拉取镜像_k8s核心实战总结---分布式云原生部署架构搭建033
注意在看的时候一定要把 dxxxx中的xxxx换成--o----c----k----e----r 然后我们再来看一个k8s中的secret的功能,这个功能 用来存储密码的,configMap是用来存配置的 比如我们有个pod,他的镜像,如果是需要密码的,那么 我们现在是从公共仓库拉取的,如果我们从私有仓库拉取,有密码…...
21集 ESP32-IDF开发教程-《MCU嵌入式AI开发笔记》
21集 ESP32-IDF开发教程-《MCU嵌入式AI开发笔记》 之前我们用了windows系统搭建了ESP-IDF的开发环境, 我们还是参考这个官方文档https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.1/esp32s3/get-started/index.html 同时我们也参考之前讲到的&#…...
《大数据基础》相关知识点及考点,例题
1.6大数据计算模式 1、MapReduce可以并行执行大规模数据处理任务,用于大规模数据集(大于1TB)的并行运算。MapReduce 极大地方便了分布式编程工作,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Redu…...
网络通信介绍
一、 简介 网络通信,简而言之,就是通过各种物理链路和协议,实现不同地理位置的计算机或其他电子设备之间信息交换的过程。这些信息可以是文本、图像、音频、视频等多种格式,通过网络传输至目标设备,从而实现远程通信、…...
16、Python之容器:元组与列表、推导式与生成式,差之毫厘谬以千里
引言 从上一篇文章开始了对Python中容器的介绍,已经对列表的简单使用做了一些介绍,今天这篇文章,打算首先简单介绍一下元组,同时比较一下元组、列表的异同,然后就列表、元组的一些比较实用的用法,做一些补…...
HTTP协议——请求头和请求体详情
HTTP协议-请求头和请求体 请求头 请求头(Request Header)是在HTTP协议中用于描述一个HTTP请求的元数据。它是客户端发送给服务器的一部分请求信息,包含了客户端的相关配置和要求。 请求头通常包含以下几个部分: 1. 请求方法(Req…...
编程中的智慧之设计模式二
设计模式:深度解析与实战应用 在上一篇文章中,我们探讨了创建型模式、结构型模式和行为模式中的一些常用模式及其Java实现。本篇将继续深入探讨设计模式,重点介绍更多的行为模式以及架构模式在实际开发中的应用。 行为模式 责任链模式&…...
基于python的百度资讯爬虫的设计与实现
研究背景 随着互联网和信息技术的飞速发展,网络已经成为人们获取信息的主要来源之一。特别是搜索引擎,作为信息检索的核心工具,极大地改变了人们获取信息的方式。其中,百度作为中国最受欢迎的搜索引擎之一,其新闻搜索…...
用 WireShark 抓住 TCP
Wireshark 是帮助我们分析网络请求的利器,建议每个同学都装一个。我们先用 Wireshark 抓取一个完整的连接建立、发送数据、断开连接的过程。 简单的介绍一下操作流程。 1、首先打开 Wireshark,在欢迎界面会列出当前机器上的所有网口、虚机网口等可以抓取…...
Lua基础知识入门
1 基础知识 标识符:标识符的定义和 C语言相同:字母和下划线_ 开头, 下划线_ 大写字母一般是lua保留字, 如_VERSION 全局变量:默认情况下,变量总是认为是全局的,不需要申明,给一个变…...
【机器学习实战】Datawhale夏令营2:深度学习回顾
#DataWhale夏令营 #ai夏令营 文章目录 1. 深度学习的定义1.1 深度学习&图神经网络1.2 机器学习和深度学习的关系 2. 深度学习的训练流程2.1 数学基础2.1.1 梯度下降法基本原理数学表达步骤学习率 α梯度下降的变体 2.1.2 神经网络与矩阵网络结构表示前向传播激活函数…...
开发扫地机器人系统时无法兼容手机解决方案
在开发扫地机器人系统时,遇到无法兼容手机的问题,可以从以下几个方面寻求解决方案: 一、了解兼容性问题根源 ① 操作系统差异:不同手机可能运行不同的操作系统(如iOS、Android),且即使是同一操…...
Elasticsearch 角色和权限管理
在大数据和云计算日益普及的今天,Elasticsearch 作为一款强大的开源搜索引擎和数据分析引擎,被广泛应用于日志分析、全文搜索、实时监控等领域。随着业务规模的扩大和数据敏感性的增加,对 Elasticsearch 的访问控制和权限管理也变得越来越重要…...
华为HCIP Datacom H12-821 卷42
42.填空题 如图所示,MSTP网络中SW1为总根,请将以下交换机与IST域根和主桥配对。 参考答案:主桥1468 既是IST域根又是主桥468 既不是又不是就是25 解析: 主桥1468 既是IST域根又是主桥468 既不是又不是就是25 43.填空题 网络有…...
【精品资料】物业行业BI大数据解决方案(43页PPT)
引言:物业行业BI(Business Intelligence,商业智能)大数据解决方案是专为物业管理公司设计的一套综合性数据分析与决策支持系统。该解决方案旨在通过集成、处理、分析及可视化海量数据,帮助物业企业提升运营效率、优化资…...
推荐一款处理TCP数据的架构--EasyTcp4Net
EasyTcp4Net是一个基于c# Pipe,ReadonlySequence的高性能Tcp通信库,旨在提供稳定,高效,可靠的tcp通讯服务。 基础的消息通讯 重试机制 超时机制 SSL加密通信支持 KeepAlive 流量背压控制 粘包和断包处理 (支持固定头处理,固定长度处理,固定字符处理) 日志支持Pipe &…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
