当前位置: 首页 > 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;用…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

【AI学习】wirelessGPT多任务无线基础模型摘要

收看了关于WirelessGPT多任务无线基础模型的演讲视频&#xff0c;边做一个记录。 应该说&#xff0c;在无线通信大模型的探索方面&#xff0c;有一个非常有益的尝试。 在沈学明院士带领下开展 https://www.chaspark.com/#/live/1125484184592834560...

Tableau for mac 驱动

Tableau 驱动程序安装指南 对于希望在 Mac OS 上使用 Tableau 进行数据分析的用户来说&#xff0c;确保正确安装相应的驱动程序至关重要。Tableau 支持多种数据库连接方式&#xff0c;并提供官方文档指导如何设置这些连接。 安装适用于 Mac 的 JDBC 或 ODBC 驱动程序 为了使…...