初识 模版 和 STL
前言
今天简单和大家分享一下C++重要的两个内容,经过之前的学习我们已经了解了C++的大致语法,接下来就是C++相关的库和一些操作了,他们能极大地缩小我们C语言阶段的代码量,让写代码变得轻松起来。
1.关于模版
<1>泛型编程
我们学过函数重载之后,我们知道参数的类型不同就可以写n个函数重载,比如swap函数,底层的交换逻辑是很简单的,但我们重载却要写很多函数,很麻烦。
在C++中就有了模版这一概念,将这个过程交给编译器去做,大大减少了程序员的工作量
模版有函数模版和类模版之分,我们先来介绍函数模版。
<2>函数模版的格式
typename也可以用class来替换,他们都是用来定义模版的关键字
template<typename T>
void Swap( T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
<3>函数模版的原理
函数模版并不是函数,他们相当于蓝图,调用它们的时候再由编译器根据基本逻辑和实参去实现一个符合要求的基本函数。
也就是说函数模版可以根据实参自动识别并生成符合的函数,这个过程由编译器去完善和实现。
这里涉及到隐式实例化和显示实例化。
(1)隐式实例化
关于隐式实例化依靠的是模版的自动识别特性,举个例子;
int main()
{int a=9,b=10;double c = 1.0 ,d = 2.0;swap(a,b);swap(c,d);return 0;
}
(2)显示实例化
关于显示实例化就是在函数名后实现用 <类型> 显示所要实现的类型
int main(void)
{int a = 10;double b = 20.0;
// 显式实例化Add<int>(a, b);return 0;
}
(3)
模版函数和全局函数可以同时存在,什么意思呢,我们可以写一个模版函数,我们可以再写一个同名逻辑相同的函数,二者可以同时存在,就像这样:
int Add(int left, int right)
{
return left + right;
} template<class T>
T Add(T left, T right)
{
return left + right;
}
这样就会产生一个问题,编译器到底会使用那个函数:
它有这样一个原则:有现成的吃现成,也就是说非模版函数能满足我们的需求,那么我们就使用非模版函数。
如果说模版函数能提供给我们一共更符合的,那么编译器就会使用模版函数。
<4>类模版
关于类模版,与函数模版有很多相似的地方,但略有差别
关于类模版的用处,我们可以想到学习过的栈,队列这样的数据结构,我们在C语言阶段实现的时候,对于数据类型我们通常是typedef 某个数据类型为StackDateType等等,在这里我们完全可以使用类模版,来代替这个栈或队列等数据结构的数据类型,比如下面这个例子:
template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;
}
void Push(const T& data);
private:T* _array;size_t _capacity;size_t _size;
};
模版类不建议声明和链接分开定义会出现链接报错;
但是在类模版这里我们只能使用显示实例化,比如说这样去实现。
int main()
{// Stack是类名,Stack<int>才是类型Stack<int> st1; // intStack<double> st2; // doublereturn 0;
}
2.了解什么是STL
STL这个名字相信大家在没接触过C++的时候就经常听到这个名字,可见它在C++中的重要程度。
网上常说,“不会STL,你不要说你会C++”,不言而喻,那接下来我们大体来了解一下什么是STL。
(1) 什么是STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
经过多年的迭代,STL有很多版本,我们主要学习的SGI版本。
(2)STL的六大组件
迭代器,容器,算法,仿函数,空间配置器,配接器
我们当前有所熟悉的就是容器这个概念,就是一些数据结构比如说栈,队列,二叉树等等,其他的我们在后续的学习中会一一介绍。
总结
今天我们步入了C++初阶的大门,C++这门语言终会被我们所掌握,料青山略输我峥嵘。
相关文章:
初识 模版 和 STL
前言 今天简单和大家分享一下C重要的两个内容,经过之前的学习我们已经了解了C的大致语法,接下来就是C相关的库和一些操作了,他们能极大地缩小我们C语言阶段的代码量,让写代码变得轻松起来。 1.关于模版 <1>泛型编程 我们学…...
加新题了,MySQL 8.0 OCP 认证考试 题库更新
MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目:1Z0-908 近期发现,MySQL OCP认证考试题库发生变化,出现了很多新题,对此,CUUG专门收集整理了最新版本的MySQL考试原题,并会给…...
26考研——树与二叉树_树、森林(5)
408答疑 文章目录 二、树、森林树的基本概念树的定义和特性树的定义树的特性 基本术语树的基本术语和概念祖先、子孙、双亲、孩子、兄弟和堂兄弟结点的层次、度、深度和高度树的度和高度分支结点和叶结点有序树和无序树路径和路径长度 森林的基本术语和概念森林的定义森林与树的…...
26考研——图_图的基本概念(6)
408答疑 文章目录 一、图的基本概念图的定义非空性非线性结构 顶点和边的表示顶点边 有向图 & 无向图有向图有向图 G 1 G_1 G1 的表示 无向图无向图 G 2 G_2 G2 的表示 简单图 & 多重图简单图多重图 顶点的度、入度和出度顶点的度有向图的度 路径、路径长度和回路…...
笔试面试01 c/c++
基础知识 什么是数据结构?请简要描述常见的数据结构类型。 数据结构是组织和存储数据的方式,以便于高效访问和修改。常见的数据结构包括: 数组:固定大小的线性数据结构,支持随机访问。 链表:由节点组成的线…...
2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip
一、资料列表 第一课:Deepseek基础入门 第二课:DeepSeek赋能职场 第三课:普通人如何抓住DeepSeek红利 第四课:让科研像聊天一样简单 第五课:DeepSeek与AI幻觉 第六课:基于DeepSeek的AI音乐词曲的创造法 第…...
消息队列(Kafka及RocketMQ等对比联系)
目录 消息队列 一、为什么使用消息队列?消息队列有什么优点/缺点?介绍下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优点缺点,如何取舍? 1.公司业务场景是什么,这个业务场景有什么挑战,如果不用MQ有什么麻…...
Go 语言 fmt 模块的完整方法详解及示例
以下是 Go 语言 fmt 模块的完整方法详解及示例,涵盖所有核心功能: 一、输出函数 将数据写入标准输出、文件或字符串。 1. Print / Println / Printf 功能 Print: 写入标准输出,不换行。Println: 写入标准输出并换行。Printf: 格式化写入标…...
Centos 7 安装VNC服务
Centos 7 安装VNC服务 1. 安装 TigerVNC2. 设置 VNC 密码3. 创建并配置 x0vncserver 服务4. 启用并启动服务5. 检查服务状态6. 配置防火墙7. 连接 VNC问题1:出现无法安装可能是镜像源导致的。手动配置镜像源清除 YUM 缓存并重新加载 1. 安装 TigerVNC 确保已安装 TigerVNC 服务…...
3.25-3 request断言
一.request断言 if断言 案例: import requests srequests.Session() url1"http://49.233.201.254:8080/cms/manage/loginJump.do" data1{userAccount:admin,loginPwd:123456} h1{"Content-Type":"application/x-www-form-urlencoded&…...
cmakelist中添加opencv
版本选择 qt的msvc,版本2019 opencv版本 4.5.3 配置了环境变量 x64下的v14中的bin 配置头文件 {"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}","d:\\QT\\6.5.3\\msvc20…...
【003安卓开发方案调研】之ReactNative技术开发安卓
基于2025年最新行业动态和搜索资料,以下是针对国内使用React Native(RN)开发安卓应用的深度分析: 一、技术成熟度评估 1. 核心架构升级 新架构全面普及:2024年起,React Native的 新架构(Fabri…...
面试中如何回答性能优化的问题
性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些。 对应用进行性能优化,是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。一个简单的应用…...
使用cursor开发java案例——springboot整合elasticsearch
安装elasticsearch 打开cursor,输入如下提示词 使用springboot整合elasticsearch。其中elasticsearch服务器ip:192.168.236.134 管理员用户名elastic 管理员密码 PdQy_xfR2yLhpok*MK_ 监听端口9200点Accept all 使用idea打开生成的项目 ࿰…...
CCF-CSP认证题目练习及其题解(4
【问题描述】 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。 【输入形式】 输入的第一行包含一个整数n&#x…...
Chrome 134 版本开发者工具(DevTools)更新内容
Chrome 134 版本开发者工具(DevTools)更新内容 一、隐私与安全面板 旧的 Security 面板已演变为隐私与安全面板,并新增了一个专注于隐私的部分。在该部分中,可以: 在 DevTools 打开时,临时限制第三方 Co…...
12届蓝桥杯—货物摆放
货物摆放 题目描述 小蓝有一个超大的仓库,可以摆放很多货物。 现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...
oracle查询归档日志使用量
1.统计最近30天的数据 SELECT TRUNC(first_time, DD) "日期", SUM(blocks * block_size) / 1024 / 1024 / 1024 "大小(GB)" FROM v$archived_log WHERE first_time > SYSDATE - 30 -- 统计最近30天的数据 GROUP BY TRUNC(first_time, DD) ORDER BY 1 D…...
Redis 发布订阅
Redis 发布订阅 概述 Redis 发布订阅(Pub/Sub)是一种消息传递模式,允许应用在多个客户端之间进行通信。在Redis中,发布订阅允许客户端订阅一个或多个频道,并在这些频道上发布消息。其他订阅了相同频道的客户端会接收到这些消息。 核心概念 频道(Channels) 频道是发…...
歌曲缓存相关功能
1. 核心组件 MusicCacheManager (音乐缓存管理器) 单例模式:确保全局只有一个实例,方便管理。 private static var instance: MusicCacheManager?static func shared() -> MusicCacheManager {if instance nil {instance MusicCacheManager()}ret…...
MySQL学习之用户管理
MySQL学习之用户管理 一、用户1、用户信息2、创建用户3、修改用户密码4、删除用户 二、数据库权限1、MySQL中的权限2、给用户授权3、回收权限 一、用户 1、用户信息 MySQL用户管理: ①、与Linux操作系统类似,MySQL中也有超级用户和普通用户之分。 ②、如…...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
算法训练营第二十三天 | 贪心算法(一)
文章目录 一、贪心算法理论基础二、Leetcode 455.分发饼干二、Leetcode 376. 摆动序列三、Leetcode 53. 最大子序和 一、贪心算法理论基础 贪心算法是一种在每一步选择中都采取当前状态下的最优决策,从而希望最终达到全局最优解的算法设计技术。 基本思想 贪心算…...
SpringCloud消息总线:Bus事件广播与配置动态刷新
文章目录 引言一、Spring Cloud Bus基本架构二、配置动态刷新实现2.1 基础配置2.2 刷新流程2.3 定向刷新 三、自定义事件广播3.1 定义自定义事件3.2 注册和监听事件3.3 发布事件 四、高级配置与优化4.1 消息持久化4.2 事件追踪4.3 安全控制 总结 引言 在微服务架构中ÿ…...
家庭网络结构之局域网通信
整个互联网非常复杂,涉及到很多知识,学习互联网不能一蹴而就,所以这里从最简单的家庭网络开始学习 家庭网络一般是通过Modem( 作用:进行数字信号和模拟信号的转换 ) 拨号上网,然后通过家庭路由器,将网络连接…...
突破反爬困境:SDK架构设计,为什么选择独立服务模式(四)
声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…...
java 设置操作系统编码、jvm平台编码和日志文件编码都为UTF-8的操作方式
以下是 Java中设置操作系统编码、JVM平台编码和日志文件编码为UTF-8 的详细步骤和代码示例: 一、设置操作系统编码为UTF-8 1. Windows系统 修改系统区域设置: 进入 控制面板 → 时钟和区域 → 区域。在“管理”选项卡中,点击“更改系统区域…...
SpringBoot:几种常用的接口日期格式化方法
全局时间格式化 通过在配置文件中设置可以实现全局时间格式化。在 Spring Boot 的配置文件 application.properties(或 application.yml)中添加以下两行配置: #?格式化全局时间字段 spring.jackson.date-formatyyyy-MM-dd?HH:mm:ss #?指…...
解题思路:LeetCode 2711. 对角线上不同值的数量差
解题思路:LeetCode 2711. 对角线上不同值的数量差 在LeetCode的题目2711中,我们需要计算一个矩阵中每个单元格的左上角对角线和右下角对角线上不同值的数量差。这个问题可以通过暴力法解决,但效率较低。本文将介绍一种更高效的解决方案&…...
Jackson实现JSON数据的合并
JSON数据的操作,系列文章: 《Jackson的核心类与API方法:ObjectMapper、JsonNode、ObjectNode、ArrayNode》 《Jackson的使用与创建Jackson工具类》 《Jackson使用ObjectNode对象实现JSON对象数据(一):增、删…...
Elasticsearch 倒排索引 和 正排索引
一、倒排索引 倒排索引是 Elasticsearch 实现高效全文搜索的核心技术。它通过将词项与文档 ID 关联,支持快速检索、短语查询、布尔查询和相关性评分。尽管倒排索引在存储和更新方面有一定的开销,但通过词典优化、倒排列表压缩、分片和缓存等技术&#x…...
Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建
引擎:3.8.5 您好,我是鹤九日! 回顾 前面的几篇文章,讲述的主要是Cocos引擎对Shader使用的一些固定规则,这里汇总下: 一、Shader实现基础是OpenGL ES可编程渲染管线,开发者只需关注顶点着色器和…...
【Python】pillow库学习笔记1-Image类
《Python语言程序设计基础 》第3版,嵩天 黄天羽 杨雅婷著,P293 1.pillow库概述 Pillow 库是Python图像处理重要的第三方库。 Pillow库是PIL (Python image library) 库的一个扩展,需要通过pip工具安装。安装PIL库需要注意,安装…...
解决 MySQL 的 sql_mode 中包含 only_full_group_by模式导致group by SQL报错
sql 报错: Cause: java.sql.SQLSyntaxErrorException: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ev_data_transmission.p.push_type which is not functionally dependent on columns in GROUP BY clause; this…...
【微服务架构】本地负载均衡的实现(基于随机算法)
前言 负载均衡 概念:一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术,旨在提高系统的可用性、性能和可伸缩性。作用: 提高性能:通过将请求分散到多个实例上,避免单个实例因请求过多而过载ÿ…...
记一次线上SQL死锁事故
一、 引言 SQL死锁是一个常见且复杂的并发控制问题。当多个事务在数据库中互相等待对方释放锁时,就会形成死锁,从而导致事务无法继续执行,影响系统的性能和可用性。死锁不仅会导致数据库操作的阻塞,增加延迟,还可能对…...
电机控制常见面试问题(十八)
文章目录 一.电机控制高级拓扑结构1.LLC 二.谈谈电压器饱和后果三.电压器绕组连接方式的影响四.有源逆变的条件 一.电机控制高级拓扑结构 1.LLC LLC是什么?—— 一个会"变魔术"的电源盒子 想象你有一个魔法盒子,能把电池的电压变大或变小&…...
数据结构之双链表
目录 1 简介 2 双链表的基本概念 2.1 节点结构 2.2 头插法和尾插法 3 代码实现 4 代码解析(部分) 4.1 初始化双链表 4.2 添加节点 4.3 删除节点 4.4 获取节点 4.5 插入节点 4.6 反转链表 4.7 打印链表 4.8 核心操作分析 5 总结 1 简介 …...
dell 台式机 电脑 纽扣电池 如何取下?
dell 台式机 电脑 纽扣电池 如何取下? 戴尔-optiplex-3060-塔式机-服务手册...
JSON二次序列化问题分析
正常的JSON应该是: json Apply to VectorServic... { "id": "d471c19c-70eb-4f29-8604-b8284e8a9400", "text": "人为干预, 降低生产成本...", "metadata": { "chunkIndex": 2, …...
WebSocket 传输大量数据好不好?稳定不稳定
使用 WebSocket 传输大量数据 是可行的,但在实际应用中需要注意一些限制和优化策略。以下是关于 WebSocket 传输大量数据的详细分析: 1. WebSocket 传输大量数据的可行性 优点 实时性:WebSocket 是全双工通信协议,适合实时传输数…...
代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树(▲
目录 一、二叉树理论知识 二、构造二叉树思路 2.1 构造二叉树流程(给定中序后序 2.2 整体步骤 2.3 递归思路 2.4 给定前序和后序 三、相关算法题目 四、易错点 一、二叉树理论知识 详见:代码随想录刷题day34|(二叉树篇)二…...
无人设备遥控器之调度自动化技术篇
一、技术原理 信息采集与处理: 通过传感器、仪表等设备采集无人设备的各种数据,如位置、速度、状态等。 将采集到的数据传输到调度自动化系统中进行处理和分析,以获取设备的实时状态。 系统建模与优化: 调度自动化系统会根据…...
红宝书第十五讲:详解JavaScript迭代器与生成器:Symbol.iterator与yield
红宝书第十五讲:详解JavaScript迭代器与生成器:Symbol.iterator与yield 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、迭代器(Iterator)的“传送带”模式 迭代…...
【AI】NLP
不定期更新,建议关注收藏点赞。 目录 transformer大语言模型Google Gemma疫情网民情绪识别 整体框架 baseline构建 模型调参、模型优化、其他模型 数据trick、指标优化、magic feature 数据增强、伪标签、迁移学习 模型融合sklearn中TFIDF参数详解 频率阈值可以去掉…...
ENSP学习day10
NAT地址转换技术(一) NAT(Network Address Translation)地址转换技术是一种在计算机网络中常用的技术,在数据包从一个网络传输到另一个网络时,会对数据包中的源IP地址和目的IP地址进行修改的过程。这种技术…...
文件上传绕过的小点总结(4)
9.末尾点删除处理缺陷 给出源码: $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA,…...
实战-MySQL5.7升级8.0遇到的四个问题
近期几个项目的MySQL由5.7升级到8.0,升级过程中遇到四个问题,记录下来分享一下: 第一个问题详见之前的文章: MySQL 5.7升级8.0报异常:处理新增关键字 第二个问题详见之前的文章: MySQL 5.7升级8.0报异常…...
卷积神经网络的原理、实现及变体
卷积神经网络convolutional neural network,CNN 是为处理图像数据而生的网络,主要由卷积层(填充和步幅)、池化层(汇聚层)、全连接层组成。 卷积 虽然卷积层得名于卷积(convolution)…...
java 线程创建Executors 和 ThreadPoolExecutor 和 CompletableFuture 三者 区别
Executors是一个线程池的工具类,而ThreadPoolExecutor是Executor接口的一个实现,是线程池的核心类。 Executors提供了多种快速创建线程池的方法,而ThreadPoolExecutor则提供了更高的自定义和控制能力。 Executors是一个工具类࿰…...