【C++】模板的下一步,STL标准模板库的介绍

news2024/9/25 17:15:48

欢迎来到CILMY23的博客

🏆本篇主题为:模板的新玩法,STL标准模板库的介绍

🏆个人主页:CILMY23-CSDN博客

🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux

🏆感谢观看,支持的可以给个一键三连,点赞关注+收藏。


✨写在前头:

在学习完模板后,我们也是会了不少泛式编程,我们知道了template<typename T>是用来通用的创建模板,比起C语言的void*也是更为广泛使用,接下来我们将了解模板库,深入浅出C++ STL,迈出我们的第一步


一、什么是STL

STL是C++,Standard Template Library(标准模板库)的缩写。是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。提供了一组模板化的常见数据结构和算法,并且由于其模板本质,能够以类型无关的方式处理数据

什么是C++标准库? 

C++标准库是C++语言的一个核心部分,它为程序员提供了一系列预定义的类和函数。这些类和函数用于实现常见的程序任务,如输入/输出处理(I/O)、字符串操作、数学计算、时间/日期处理、数据结构和算法等。C++标准库是经过精心设计、经过严格测试的,且具有高度可移植性的,它覆盖了从底层语言特性到高级抽象的几乎所有方面。 

二、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)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。

三、STL随C++语言的发展

C++标准的主要版本相关联的STL的一些关键改进概览。

🍀🍀C++98与C++03

C++98是STL被正式纳入C++标准的版本。在这个版本中,STL包含了基本的容器、算法、迭代器、函数对象等。C++03是对C++98的一次微小修订,主要是对标准的清晰化和错误修正,没有对STL功能作出显著修改。

🍀🍀C++11

C++11是C++的一次重大更新,它为STL带来了许多重要的改进和扩展:

  • 新容器:unordered_mapunordered_setarray 和 forward_list
  • 新算法,例如std::copy_ifstd::find_if_not等。
  • 支持 lambda 表达式,这使得使用STL算法时可以写出更清晰、更简洁的代码。
  • std::function 和 std::bind,为函数对象提供了更灵活的使用方式。
  • 线程库(虽然严格来说不属于STL,但与并发编程的STL风格集成关系密切)。

🍀🍀C++14

C++14是对C++11的增强,增加了泛型 lambda 表达式和其他一些语言特性的小幅度改进。对STL的直接影响相对较小,主要是对现有特性的改善和一些新实用程序的添加。

🍀🍀C++17

C++17进一步扩充了STL,引入了:

  • 新算法,如std::clampstd::for_each_n等。
  • 新容器适配器std::scoped_lock
  • std::optionalstd::variantstd::any等用于增强编码灵活性和错误处理能力的工具。
  • 并行算法版本,允许算法利用多核处理器的优势来加速操作。

🍀🍀C++20

C++20是一个重大更新,对STL作了显著扩展:

  • 引入了概念(Concepts),这是一种新的语言特性,用来指定模板类型参数必须满足的接口和语义约束。
  • 范围视图(Ranges),提供了一种新的方式来组合并处理序列。
  • 更多的并行算法支持。
  • std::span,一个表示数组视图的轻量级容器。
  • 协程支持,虽然不是STL的一部分,但与异步编程模式紧密相关。

🍀🍀C++23

(截至2023年的信息)
C++23预计将进一步增强C++语言和STL,包括提案如统一的函数调用语法、更多的并行算法支持等。但具体内容和扩展会随着最终标准的确定而明朗化。

四、STL的六大组件

STL涉及数据结构、算法、迭代器等多个方面。STL的目标是提供高效、易用、可复用的组件。具体来说,STL由六大主要组件构成: 

  1. 容器(Containers)
    容器是用于存储数据的类模板。根据数据组织方式的不同,STL容器分为以下几类:

    • 序列容器:保持元素顺序的容器,如vectordequelistvector支持快速随机访问;deque是双端队列,支持在头尾两端快速插入和删除;list提供了快速的任意位置插入和删除。
    • 关联容器:通过键来快速查找元素的容器,如setmultisetmapmultimapset是关键字的集合,不允许重复;map是关键字到值的映射;而multisetmultimap分别允许在集合中有重复的关键字和映射。
    • 无序关联容器:C++11新增了不保持元素顺序但提供快速访问的容器,如unordered_setunordered_mapunordered_multisetunordered_multimap。这些容器使用哈希表来实现。
  2. 算法(Algorithms)
    STL算法是一系列模板函数,用来对数据进行处理。算法的种类很多,且大多不直接改变容器的内容,而是通过迭代器操作元素。几个典型的算法例子包括:

    • 非修改性算法:如find (查找元素)和count (计数元素);
    • 修改性算法:如copy (复制元素)和replace (替换元素);
    • 排序与相关操作:如sort (排序)和binary_search (二分查找);
    • 数值算法:如accumulate (计算元素总和)和inner_product (计算内积)。
  3. 迭代器(Iterators)
    迭代器是用来顺序访问容器中元素的对象。根据支持的操作,迭代器可以分为几种类别:

    • 输入迭代器:只能读取序列中的元素;
    • 输出迭代器:只能写入序列中的元素;
    • 前向迭代器:支持读取和写入操作,并能向前移动;
    • 双向迭代器:除了前向迭代器的操作外,还可以向后移动;
    • 随机访问迭代器:支持所有迭代器操作,并能在序列中任意跳跃。
  4. 适配器(Adaptors)
    适配器是用来改变其他容器、迭代器或函数对象行为的组件,大致可以分为以下几类:

    • 容器适配器:如stackqueuepriority_queue,分别提供了堆栈、队列和优先队列的行为。
    • 迭代器适配器:如insert_iteratorstream_iterator,为迭代器提供了特殊的功能。
    • 函数适配器:如bindnot1,可以改变函数对象的调用方式。
  5. 函数对象(Function Objects)
    也称为仿函数,这是重载了函数调用操作符()的对象。STL中的函数对象常用于定义如何执行某些操作,例如定义如何比较两个对象。例如,可以写一个函数对象来定义自定义排序准则。

    常见的函数对象包括用于算法的比较函数,如std::lessstd::greater

  6. 分配器(Allocators)
    分配器是用来抽象内存模型和管理容器内存分配的对象。每个STL容器类型都接受另一个模板参数来指定它的分配器,默认情况下使用std::allocator。分配器使容器能够独立于具体内存模型管理内存分配。


🛎️感谢各位同伴的支持,本期C++就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【qt】一次性学会所有对话框

对话框 一.前言二.文件对话框1.选择一个文件2.选择多个文件3.选择目录4.保存文件 三.颜色对话框1.获取颜色 四.字体对话框1.获取字体 五.输入对话框1.输入文本2.输入整数3.输入小数4.输入条目 六.消息对话框1.问题框2.信息框3.警告框4.危机框5.关于框6.关于qt框七.总结 一.前言…

芯片设计 | FPGA设计的各种仿真概念分析

前仿真,即功能仿真。 可使用专用于仿真的工具对设计进行功能仿真,以验证电路功能是否符合设计要求。 通过功能仿真能够及时发现设计中的错误,从而加快设计进度,提高设计的可靠性。 综合后的仿真 把综合生成的标准延时反标注到综合仿真模型去,可估计门延时带来的影响,…

Java核心: 使用asm操作字节码

在上一篇<Java核心: 注解处理器>中我们提到&#xff0c;通过实现AbstractProcessor&#xff0c;并调用javac -processor能够生成代码来实现特殊逻辑。不过它存在两个明显的问题: 只能新增源文件来扩展逻辑&#xff0c;无法修改现有的类或方法 必须有一个单独的编译过程&a…

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言随机查询语…

首发AI新功能 贝锐向日葵远程控制IT精英版助力IT运维

从1947年晶体管发明开始&#xff0c;以计算机为核心载体的IT技术狂奔发展至今&#xff0c;这期间IT运维方式也在不断的发展变化。 我们经历了50s-70s的肉身更换电子管&#xff1b; 经历了80s-90s的本地软件运维&#xff1b; 经历了90s-00s互联网的澎湃发展&#xff0c;Telne…

VMware vSphere Distributed Services Engine 和利用 DPU 实现网络加速

VMware相关学习专栏&#xff1a;虚拟化技术 vSphere 8.0 通过加速数据处理单元 (DPU) 上的网络功能实现了突破性的工作负载性能。 vSphere 8.0 通过加速 DPU 上的网络功能实现了突破性工作负载性能&#xff0c;从而满足现代分布式工作负载的吞吐量和延迟需求。借助 vSphere Dis…

【C++题解】1133. 字符串的反码

问题&#xff1a;1133. 字符串的反码 类型&#xff1a;字符串 题目描述&#xff1a; 一个二进制数&#xff0c;将其每一位取反&#xff0c;称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符&#xff0c;则它和字符 a 的距离与它的反码和字符 z 的距离…

godot4.2 + GDextension c++在 vs code 中断点调试配置

游戏开发中如果做不到自己编写的代码做断点调试&#xff0c;无不是瞎子摸象&#xff0c;特别是C这么底层的语言。这2天开始在VS studio中折腾&#xff0c;一直折腾不出结果&#xff0c;几次想要放弃GODOT。最终今天在VS code中搞定了这断点调试C代码。 在上一篇文章我已经做好了…

windows部署ollama+maxkb+vscode插件continue打造本地AI

windows部署ollamamaxkbvscode插件continue打造本地AI 前言下载ollamadocker desktopvscode插件continue 安装安装ollama设置环境变量 安装docker desktop部署maxkb容器 安装vscode插件模型搜索和推荐 前言 我采用docker运行maxkb&#xff0c;本地运行ollama形式。可能是windo…

深度神经网络——贝叶斯与朴素贝叶斯定理

概述 贝叶斯定理是概率论中一个非常重要的概念&#xff0c;它提供了一种在已知某些相关事件的概率时&#xff0c;计算另一个事件发生概率的方法。在你提供的内容中&#xff0c;贝叶斯定理被描述为一种“魔法”&#xff0c;因为它能够使计算机通过分析大量的数据来预测人们可能…

今日好料推荐(Altium Designer + 仿真器驱动)

今日好料推荐&#xff08;Altium Designer 仿真器驱动&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 Altium Designer Altium Designer 是一种高度集成的电子设计自动化 (EDA) 软件工具&#xff0c;广泛应用于电子电路和印刷电路板 (PCB) …

汇编原理(三)编程

源程序&#xff1a; 汇编指令&#xff1a;有对应的机器码与其对应 伪指令&#xff1a;无对应的机器码&#xff0c;是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作。 ex1:XXX segment、XXX ends这两个是一对成对使用的伪指令&#xff0c;且必须会被用…

充电器快充协议与PW6606快充电压诱骗芯片

随着科技的快速发展&#xff0c;手机、平板等电子产品对于充电速度的要求越来越高&#xff0c;快充技术应运而生。在市场上&#xff0c;我们常见的快充充电器主要分为两种类型&#xff1a;A口充电器&#xff08;USB口&#xff09;和TYPE C口充电器。每种类型都拥有其独特的快充…

埃文科技携数据要素产品亮相第七届数字中国建设峰会

第七届数字中国建设峰会&#xff08;以下简称“峰会”&#xff09;于2024年5月24日至25日在福建省福州市举办。此次峰会是国家数据工作体系优化调整后举办的首次数字中国建设峰会。本届峰会由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同…

10分钟就可以用AI制作绘本小故事?自媒体涨粉变现利器,实战练习,轻松上手!

大家好&#xff0c;我是向阳 关于最近有老铁私信我如何使用AI制作儿童画册进行AI变现&#xff0c;由于需求的朋友不少&#xff0c;那么本次我将从头到尾将整个创作过程简单和各位介绍下&#xff0c;也欢迎各位老铁一些学习交流。 本次制作过程中所有工具均不需要付费也无需魔…

YOLOv10涨点改进:如何魔改注意力进行二次创新,高效替换PSA | NEU-DET为案列进行展开

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进&#xff1a;替换YOLOv10中的PSA进行二次创新&#xff0c;1&#xff09;EMA替换 PSA中的多头自注意力模块MHSA注意力&#xff1b;2&#xff09; EMA直接替换 PSA&#xff1b; 在NEU-DET案列进行可行性验证&#xff0c;1&#x…

Laravel 图片添加水印

和这个配合使用 Laravel ThinkPhP 海报生成_laravel 制作海报-CSDN博客 代码 //水印 $x_length $imageInfo[0]; $y_length $imageInfo[1];$color imagecolorallocatealpha($posterImage, 255, 255, 255, 70); // 增加透明度参数alpha$font_size 40; //字体大小 $angle …

RAG架构的数据准备流程

虽然现成的大型语言模型 (LLM) 功能强大&#xff0c;但企业发现&#xff0c;根据其专有数据定制 LLM 可以释放更大的潜力。检索增强生成 (RAG) 已成为这种定制的主要方法之一。RAG 模型将大型语言模型强大的语言理解能力与检索组件相结合&#xff0c;使其能够从外部数据源收集相…

螺旋矩阵(算法题)

文章目录 螺旋矩阵解题思路 螺旋矩阵 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]解题思路 模…

全局数据 与 singleton 类的选择

1&#xff0c;singleton 相对于全局数据的优势 使用 Singleton 类相对于全局数据具有以下好处&#xff1a; 1.1. 延迟初始化&#xff1a;Singleton 类可以实现延迟初始化&#xff0c;即在需要时才创建实例&#xff0c;而全局数据在程序启动时就会被初始化。这可以节省资源并提…