当前位置: 首页 > news >正文

【C++】模版初阶+STL简介

头像
🚀个人主页:奋斗的小羊
🚀所属专栏:C++
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

目录

  • 前言
  • 💥1、函数模版
    • 💥1.1 函数模板概念
    • 💥1.2 函数模板格式
    • 💥1.3 函数模板的原理
    • 💥1.4函数模版实例化
    • 💥1.5模版参数的匹配原则
  • 💥2、类模版
    • 💥2.1类模版的定义格式
    • 💥2.2类模板的实例化
  • 💥3、STL简介
    • 💥3.1 什么是STL
    • 💥3.2 STL的版本
    • 💥3.3 STL六大组件
    • 💥3.4如何学习STL
  • 总结


前言

如果有一个模具,通过给这个模具中填充不同材料(类型),来获得不同
材料的铸件(生成具体类型的代码),那我们将会方便很多。
泛型编程:允许函数和数据结构使用任何数据类型,而不需要为每种数据类型编写重复的代码。模板是泛型编程的基础。


💥1、函数模版

💥1.1 函数模板概念

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


💥1.2 函数模板格式

template<class / typename T1,......,class / typename Tn>
typename用来定义模板参数关键字,也可以使用classtypename更贴切,但class更常见。
以交换函数为例:

template<class T>
void Swap(T& x, T& y)
{T z = x;x = y;y = z;
}

💥1.3 函数模板的原理

函数模板是一个蓝图,它本身并不是函数,是编译器使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。
在这里插入图片描述

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码。


💥1.4函数模版实例化

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

  1. 隐式实例化:编译器根据实参推演模板参数的实际类型
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{int a1 = 1;int a2 = 2;double d1 = 1.1;double d2 = 2.2;Add(a1, a2);Add(d1, d2);return 0;
}
  1. 显示实例化:在函数明后的<>中指定模版参数的实际类型
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{int a = 1;double d = 1.1;Add<int>(a, d);Add<double>(a, d);return 0;
}

如果类型不同:

template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{//编译错误//编译器无法确定此处到底该将T确定为int 或者 double类型而报错//Add(a1, d2);Add(a1, (int)d2);//强转Add<int>(a1, d2);//显示实例化
}	

💥1.5模版参数的匹配原则

  • 一个非模版函数可以和一个同名的函数模版同时存在,而且该函数模版还可以被实例化为这个非模版函数
#include <iostream>
using namespace std;//专门处理int的加法函数
int Add(const int& x, const int& y)
{return x + y;
}//通用加法函数
template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{Add(1, 2);//与非模版函数匹配,编译器不需要特化Add<int>(1, 2);//调用编译器特化的Add版本return 0;
}
  • 对于非模版函数和同名函数模版,如果其他条件都相同,在调动时会优先调用非模版函数而不会从模版产生一个实例。如果模版可以产生一个具有更好匹配的函数,那么将选择模版
#include <iostream>
using namespace std;//专门处理int的加法函数
int Add(const int& x, const int& y)
{return x + y;
}//通用加法函数
template<class T1, class T2>
T1 Add(const T1& x, const T2& y)
{return x + y;
}int main()
{Add(1, 2);//与非模版函数匹配,编译器不需要特化Add(1, 2.2);//模版函数可以生成更加匹配的版本,编译器根据//实参生成更加匹配的Add函数return 0;
}

💥2、类模版

💥2.1类模版的定义格式

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

下面以栈为例:

#include <iostream>
#include <string.h>
using namespace std;// 类模版
template<class T>
class Stack
{
public:Stack(size_t n = 4):_array(new T[n]), _capacity(n),_size(0){}~Stack(){delete[] _array;_array = nullptr;_size = _capacity = 0;}void Push(const T& data);//...private:T* _array;size_t _capacity;size_t _size;
};//模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误
//模版参数只能给当前的函数或者类使用
template<class T>
void Stack<T>::Push(const T& data)
{if (_size == _capacity){//手动地异地扩容T* tmp = new T[2 * _capacity];memcpy(tmp, _array, sizeof(T) * _size);delete[] _array;_array = tmp;tmp = nullptr;_capacity *= 2;}_array[_size++] = data;
}int main()
{Stack<int> st1;st1.Push(1);st1.Push(2);st1.Push(3);Stack<char> st2;st2.Push('a');st2.Push('b');st2.Push('c');return 0;
}
  • 模版不建议声明和定义分离到两个文件.h 和.cpp,会出现链接错误
  • 模版参数只能给当前的函数或者类使用
  • 栈空间不足时需要我们手动异地扩容

💥2.2类模板的实例化

类模版都是显示实例化,类模板名字不是真正的类,而实例化的结果才是真正的类。

// Stack是类名,Stack<int>才是类型
Stack<int> st1; // int
Stack<double> st2; // double
  • Stack是类名,Stack<int>才是类型

💥3、STL简介

💥3.1 什么是STL

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


💥3.2 STL的版本

  • 原始版本
    Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
  • P. J. 版本
    由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
  • RW版本
    由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
  • SGI版本
    由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。

💥3.3 STL六大组件

在这里插入图片描述


💥3.4如何学习STL

STL是C++中的优秀作品,它让我们站在前人的肩膀上,迅速发展。有人说:“不懂STL,不要说你会C++”。
学习STL的三层境界:

  • 第一层:熟用STL
  • 第二层:了解泛型技术的内涵与STL的学理乃至实作
  • 第三层:扩充STL

总结

  • 模板是一种有效的代码组织和复用机制,使得编写通用和灵活的程序成为可能,能够帮助开发者简化代码并提高效率。
  • STL是基于模板的,这意味着它是类型无关的。开发者可以用任何符合要求的数据类型(如基本数据类型、用户定义类型等)来使用STL提供的容器和算法,从而提高了代码的灵活性。

相关文章:

【C++】模版初阶+STL简介

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言&#x1f4a5;1、函数模版&#x1f4a5;1.1 函数模板概念&#x1f4a5;1.2 函数模板格式&#x1f4a5;1…...

Vue3中的toRef和toRefs的区别和用法

刚做了Ref和Reactive区别及使用方法笔记&#xff0c;再来总结一下&#xff0c;toRef 和 toRefs 的作用、用法、区别 1、作用和区别 toRef 和 toRefs 可以用来复制 reactive 里面的属性然后转成 ref&#xff0c;而且它既保留了响应式&#xff0c;也保留了引用&#xff0c;也就…...

【docker快捷部署系列一】docker快速入门,安装docker,解决运行Docker Quickstart Terminal出错

1、docker快速入门 视频链接 知识点概述 docker是轻量级虚拟机image是镜像 相当于虚拟机快照container是容器&#xff0c;相当于运行起来的虚拟机程序Dockerfile 是创建docker镜像的自动化脚本docker-compose 是一个定义和运行多个容器命令的工具&#xff0c;包括运行Docker…...

vulnhub靶机实战_DC-8

一、靶机下载 靶机下载链接汇总&#xff1a;https://download.vulnhub.com/使用搜索功能&#xff0c;搜索dc类型的靶机即可。本次实战使用的靶机是&#xff1a;DC-8系统&#xff1a;Debian下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 二、靶机启动 下载完…...

如何做到项目真实性优化?保姆级写简历指南第五弹!

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…...

Python Beautiful Soup介绍

在Web数据抓取和网页解析的世界里&#xff0c;Python以其简洁的语法和丰富的库资源成为了许多开发者的首选语言。而Beautiful Soup&#xff0c;作为Python中一个强大的HTML和XML解析库&#xff0c;更是以其易用性和灵活性赢得了广泛的赞誉。本文将带你走进Beautiful Soup的世界…...

NDI Tools汉化版的安装

目录 一、安装包下载 二、安装英文版 三、安装汉化版 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量、低延迟、精确到帧的方式通过网络进行通讯、传输和接收广播级质量的视频,非常适合在现场直播制作…...

【JAVA多线程】AQS,JAVA并发包的核心

目录 1.概述 1.1.什么是AQS 1.2.AQS和BlockQueue的区别 1.3.AQS的结构 2.源码分析 2.1.CLH队列 2.2.模板方法的实现 2.2.1.独占模式 1.获取资源 2.释放资源 2.2.2.共享模式 1.概述 1.1.什么是AQS AQS非常非常重要&#xff0c;可以说是JAVA并发包&#xff08;java.…...

springcloud loadbalancer nacos无损发布

前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错&#xff0c;观察日志是因为流量被下发到已下线的服务&#xff0c;重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…...

React原理

函数式编程 一种编程范式,概念比较多纯函数不可变值vdom和diff Vue2.x Vue3.x React 三者实现vdom细节都不同核心概念和实现思路,都一样h函数 用来生成vnode的函数 vnode数据结构 {tag: div,props: {className: div-class},children: [{tag: p,children: 测试}, ...] }pat…...

React-Native优质开源项目

React Native是由Facebook开发的一种开源框架&#xff0c;它允许开发者使用JavaScript和React编写原生应用&#xff0c;提供了一套跨平台的UI组件&#xff0c;可以在iOS和Android上实现一致的用户体验。在React Native的生态系统中&#xff0c;有许多优质的开源项目&#xff0c…...

Ajax-02

一.form-serialize插件 作用&#xff1a;快速收集表单元素的值 const form document.querySelector(.example-form) const data serialize(form,{hash:true,empty:true}) *参数1&#xff1a;要获取哪个表单的数据 表单元素设置name属性&#xff0c;值会作为对象的属性名 建议…...

供应商较多的汽车制造业如何选择供应商协同平台?

汽车制造业的供应商种类繁多&#xff0c;根据供应链的不同环节和产品特性&#xff0c;可以大致分为以下几类。 按供应链等级分包括&#xff1a; 一级供应商通常具有较高的技术水平和生产能力&#xff0c;能够满足汽车厂商对零部件的高品质、高性能和高可靠性的要求。 二级供应…...

【开端】JAVA Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装

一、绪论 JAVA接口返回信息ServerHttpResponse response 等登录接口token过期时需要给前端返回相关状态码和状态信息 二、Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装 返回Mono对象 public abstract class Mono<T> implements CorePublisher…...

Python(模块---pandas+matplotlib+pyecharts)

import pandas as pd import matplotlib.pyplot as plt dfpd.read_excel(简易数据.xlsx) # print(df) plt.rcParams[font.sans-serif][SimHei] #设置画布的大小 plt.figure(figsize(10,6)) labelsdf[电影中文名] ydf[国籍] # print(labels) # print(y)# import pandas as pd im…...

解决使用Navicat连接数据库时,打开数据库表很慢的问题

今天使用Navicat连接数据库时&#xff0c;发现不管表中数据多少&#xff0c;打开数据库表非常慢。 解决方法&#xff1a; Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定&#xff01; 参考文章&#xff1a;https://51.ruyo.net/14030.…...

nginx重启报错nginx: [error] invalid PID number

nginx重启报错nginx: [error] invalid PID numb 解决亲测有用 问题描述解决方式 问题描述 编译安装完 nginx 后&#xff0c;启动 nginx时&#xff0c;出现nginx已经在运行&#xff0c;然后输入 ./nginx -s reload时,出现了 nginx: [error] invalid PID number “” in “/us…...

人工智能深度学习系列—深度学习中的相似性追求:Triplet Loss 全解析

人工智能深度学习系列—深度解析&#xff1a;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;在分类问题中的应用 人工智能深度学习系列—深入解析&#xff1a;均方误差损失&#xff08;MSE Loss&#xff09;在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…...

26. Hibernate 如何自动生成 SQL 语句

1. 前言 本节和大家一起聊聊 Hibernate 是如何自动生成 SQL 语句的。通过本节的学习&#xff0c;你将了解到&#xff1a; 反射在框架中的重要性&#xff1b;元数据描述对 Hibernate 的重要性。 2. 理想状态 Hibernate 是全自动的 JDBC 框架&#xff0c;能自动构建 SQL 语句、…...

预言机(Oracle machine)

预言机&#xff08;Oracle machine&#xff09;是一个在多个领域中有不同应用和解释的概念。以下是从不同角度对预言机的详细解析&#xff1a; 一、计算复杂度理论与可计算性理论中的预言机 在计算复杂度理论与可计算性理论中&#xff0c;预言机是一种抽象电脑&#xff0c;用…...

大模型幻觉问题:RAG检索增强与约束生成解决方案

GPTQ 和 AWQ 都是量化技术&#xff0c;它们有什么区别&#xff1f;在什么场景下选哪种&#xff1f; GPTQ&#xff1a;是一种基于二阶信息&#xff08;海森矩阵&#xff09;的层级量化方法&#xff0c;它通过计算权重对误差的敏感度&#xff0c;优先保留重要的权重。侧重于整体权…...

3步释放20GB空间:DriverStore Explorer的系统驱动优化方案

3步释放20GB空间&#xff1a;DriverStore Explorer的系统驱动优化方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer&#xff08;简称RAPR&#xff09;是一款轻量…...

网盘直链解析工具:突破下载限制的技术方案与实践指南

网盘直链解析工具&#xff1a;突破下载限制的技术方案与实践指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

C++的constinit常量初始化与静态存储期变量的启动时间优化

C的constinit常量初始化与静态存储期变量的启动时间优化 在现代C开发中&#xff0c;程序的启动性能优化是一个不可忽视的课题。尤其是静态存储期变量&#xff08;如全局变量或静态局部变量&#xff09;的初始化&#xff0c;往往会导致程序启动时间延长。为了解决这一问题&…...

中文近义词工具包Synonyms的终极发展蓝图:AI时代如何重塑自然语言处理

中文近义词工具包Synonyms的终极发展蓝图&#xff1a;AI时代如何重塑自然语言处理 【免费下载链接】Synonyms :herb: 中文近义词&#xff1a;聊天机器人&#xff0c;智能问答工具包 项目地址: https://gitcode.com/gh_mirrors/sy/Synonyms Synonyms是一款强大的中文近义…...

自然堂冲刺港股:年营收53亿 利润3.5亿 估值71亿

雷递网 雷建平 4月7日演员虞书欣代言的自然堂全球控股有限公司&#xff08;简称&#xff1a;“自然堂”&#xff09;日前更新招股书&#xff0c;准备在港交所上市。2025年&#xff0c;自然堂引入一轮融资&#xff0c;总金额达7.42亿元。美町与自然堂于2024年10月23日订立股份认…...

西门子1200PLC与施耐德变频器Modbus通讯程序:实现变频启停、设定频率、读取电压、电流...

西门子1200plc与施耐德变频器modbus通讯程序&#xff0c;可以控制变频启停&#xff0c;设定频率&#xff0c;读取变频器电压、电流、运行频率&#xff0c;博图V14版本程序。直接上干货&#xff01;今天咱们聊聊西门子S7-1200 PLC和施耐德ATV系列变频器的Modbus通讯实战。这个方…...

PHP低代码表单引擎安全红线清单(XSS/CSRF/表达式注入/Schema越权共7类高危漏洞实测防御方案)

第一章&#xff1a;PHP低代码表单引擎安全红线总览低代码表单引擎在加速业务交付的同时&#xff0c;也因动态字段生成、运行时逻辑注入、元数据驱动等特性&#xff0c;天然放大了Web安全风险面。PHP作为主流后端语言&#xff0c;在此类引擎中常承担表单渲染、数据校验、流程路由…...

MVN--07

一、MyBatis 参数封装规则MyBatis 会根据接口方法的参数类型&#xff0c;自动进行不同的封装处理&#xff0c;核心由 ParamNameResolver 类实现。1. 单个参数的封装规则表格参数类型封装规则XML 中取值方式POJO 实体类直接使用&#xff0c;无需额外处理#{属性名}&#xff08;属…...

Windows HEIC缩略图终极指南:3分钟免费解决iPhone照片预览问题

Windows HEIC缩略图终极指南&#xff1a;3分钟免费解决iPhone照片预览问题 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 还在为…...