【C++ 学习 ⑧】- STL 简介
目录
一、什么是 STL?
二、STL 的版本
三、STL 的 6 大组件和 13 个头文件
四、学习 STL 的 3 个境界
五、STL 的缺陷
参考资料:
STL教程:C++ STL快速入门(非常详细) (biancheng.net)。
C++ STL是什么,有什么用? (biancheng.net)。
C++ STL版本有哪些? (biancheng.net)。
C++ STL基本组成(6大组件+13个头文件) (biancheng.net)。
一、什么是 STL?
STL 是 "Standard Template Library" 的缩写,中文可译为 "标准模板库" 或者 "泛型库",其包含有大量的类模板和函数模板,是 C++ 提供的一个基础模板的集合。
STL 最初由惠普实验室开发,于 1998 年被认定为国际标准,正式成为 C++标准库的重要组成部分。
值得一提的是,如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是 STL 被广泛使用的原因之一。
STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。
从根本上来说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了十几年来算法和数据结构的研究成果,汇集了许多计算机专家经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。
注意,这里提到的容器,本质上就是封装有数据结构的类模板,例如 list、vector、set、map 等。
二、STL 的版本
自 1998 年 ANSI/ISO C++ 标准正式定案,C++ STL 规范版本正式通过以后,由于其是开源的,各个 C++ 编译器厂商在此标准的基础上,实现了满足自己需求的 C++ STL 泛型库,主要包括:
-
HP STL
HP STL 是 Alexandar Stepanov(STL 标准模板库之父)在惠普 Palo Alto 实验室工作时,与 Meng Lee 合作完成的。HP STL 是开放源码的,即任何人都可以免费使用、复制、修改、发布和销售该软件以及相关文档,但前提是必须在相关文档中,加入 HP STL 版本信息和授权信息。
HP STL 是 C++ STL 的第一个实现版本,其他版本的 C++ STL 一般是以 HP STL 为蓝本实现出来的。不过,现在已经很少直接使用此版本的 STL 了。
-
SGI STL
Stepanov 在离开 HP 之后,就加入到了 SGI 公司,并和 Matt Austern 等人共同开放了 SGI STL。严格意义上来说,它是 HP STL 的一个继承版本。和 HP STL 一样,SGI STL 也是开源的,其源代码的可读性非常好,并且任何人都可以修改和销售它。
注意,SGI STL 只能算是一个 "民间" 版本,因此并不是所有支持 C++ 的编译器都支持 SGI STL,唯一能确定的是,GCC(Linux 下的 C++ 编译器)是支持的,所以 SGI STL 在 Linux 平台上的性能非常出色。
-
STLport
为了使 SGI STL 的基本代码适用于 VC++ 和 C++ Builder 等多种编译器,俄国人 Boris Fomitchev 建立了一个 free 项目来开发 STLport,此版本 STL 是开放源代码的。
-
PJ STL
PJ STL(全称 P.J Plauger STL)是由 P.J.Plauger(美国人,1965 年毕业于普林斯顿大学,物理学专业学士)参照 HP STL 实现出来的,也是 HP STL 的一个继承版本,因此该头文件不仅包含 HP STL 的相关授权信息,同时还有 P.J.Plauger 本人的授权信息。
其实 PJ STL 是 P.J.Plauger 公司的产品,尽管该公司当时只有 3 个人。
PJ STL 被 Visual C++ 编译器所采用,但和 PH STL、SGI STL 不同的是,PJ STL 并不是开源的。
-
Rouge Wave STL
该版本的 STL 是由 Rouge Wave 公司开放的,也是继承 HP STL 的一个版本,它也不是开源的。
Rouge Wave STL 用于 Borland C++ Builder 编译器中,我们可以在 C++ Builder 的 Include 子目录中找到该 STL 的所有头文件。
值得一提的是,尽管 Rouge Wave STL 的性能不是很好,但 C++ Builder 对 C++ 语言标准的支持还算不错,所以一定程度上使 Rouge Wave STL 的表现得以改善。
遗憾的是,由于 Rouge Wave STL 长期没有更新且不完全符合标准,因此 Rouge Wave STL 在 6.0 版本时改用 STLport 版本(之后的版本也都采用了 STLport),不过考虑到和之前版本的兼容,6.0 版本中依旧保留了 Rouge Wave STL。
Rouge Wave 公司在 C++ 程序库领域应该说是大名鼎鼎,对 C++ 标准化的过程出力甚多。不过 Rouge Wave STL 版本不仅更新频率慢,费用还高,基于这两个原因,Borland 在 6.0 版本决定奇用 Rouge Wave STL 而改用 STLport。
三、STL 的 6 大组件和 13 个头文件
通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 个部分构成,其中后面 4 个部分是为前面 2 个部分服务的,它们各自的含义如下表所示:
| STL 的组成部分 | 含义 |
|---|---|
| 容器(Containers) | 一些封装数据结构的类模板,例如 vector 向量容器、list 列表容器等 |
| 算法(Algorithms) | STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的函数模板,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 <algorithm> 中,少部分位于头文件 <numeric> 中 |
| 迭代器(Iterators) | 在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂 |
| 函数对象(Functors) | 如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数) |
| 适配器(Adapters) | 可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。 |
| 内存分配器(Allocators) | 为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。 |

另外,在惠普实验室最初发行的版本中,STL 被组织成 48 个头文件;但在 C++ 标准中,它们被重新组织为 13 个头文件:
<iteraotr> <functional> <vector> <deque>
<list> <queue> <stack> <set>
<map> <algorithm> <numeric> <memory>
<utility>
按照 C++ 标准库的规定,所有标准头文件都不再有扩展名。以 <vector> 为例,此为无扩展名的形式,而 <vector.h> 为有扩展名的形式。
但是,或许为了向下兼容,或许是为了内部组织规划,某些 STL 版本同时存储具备扩展名和无扩展名的两份文件(例如 Visual C++ 支持的 Dinkumware 版本同时具备 <vector> 和 <vector.h>);甚至有些 STL 版本同时具有 3 种形式的头文件(例如 SGI 版本同时拥有 <vector>、<vector.h> 和 <stl_vector.h>);但也有个别的 STL 版本只存在包含扩展名的头文件(例如 C++ Builder 的 Rauge Ware 版本只有 <vector.h>)。
建议读者养成良好的习惯,遵照 C++ 规范,使用无扩展名的头文件。
四、学习 STL 的 3 个境界

简单总结一下,学习 STL 的 3 个境界分别为:能用、明理、能扩展。
五、STL 的缺陷
-
STL 库的更新太慢了。上一版靠谱的是 C++98,中间的 C++03 基本是一些修订,C++11 出来已经相隔 13 年了,STL 才进一步更新。
-
STL 现在都没有支持线程安全。并发环境下需要我们自己加锁,且锁的粒度是比较大的。
-
STL 极度地追求效率,导致内部比较复杂,比如类型萃取、迭代器萃取。
-
STL 的使用会有代码膨胀的问题,当然这是模板语法本身导致的。
相关文章:
【C++ 学习 ⑧】- STL 简介
目录 一、什么是 STL? 二、STL 的版本 三、STL 的 6 大组件和 13 个头文件 四、学习 STL 的 3 个境界 五、STL 的缺陷 参考资料: STL教程:C STL快速入门(非常详细) (biancheng.net)。 C STL是什么,有…...
论文笔记--Deep contextualized word representations
论文笔记--Deep contextualized word representations 1. 文章简介2. 文章概括3 文章重点技术3.1 BiLM(Bidirectional Language Model)3.2 ELMo3.3 将ELMo用于NLP监督任务 4. 文章亮点5. 原文传送门 1. 文章简介 标题:Deep contextualized word representations作者…...
【MySQL高级篇笔记-性能分析工具的使用 (中) 】
此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库服务器的优化步骤 二、查看系统性能参数 三、统计SQL的查询成本:last_query_cost 四、定位执行慢的 SQL:慢查询日志 1、开启慢查询日志参数 2、查看慢查询数目 3、慢查询日志分析工具…...
大学生数学建模题论文
大学生数学建模题论文篇1 浅论高中数学建模与教学设想 论文关键词:数学建模 数学 应用意识 数学建模教学 论文摘要:为增强学生应用数学的意识,切实培养学生解决实际问题的能力,分析了高中数学建模的必要性,并通过对高中…...
论文阅读 —— 滤波激光SLAM
文章目录 FAST-LIO2FAST-LIOIMUR2LIVER3LIVEEKFLINS退化摘要第一句 FAST-LIO2 摘要: 本文介绍了FAST-LIO2:一种快速、稳健、通用的激光雷达惯性里程计框架。 FAST-LIO2建立在高效紧耦合迭代卡尔曼滤波器的基础上,有两个关键的新颖之处&#…...
JavaScript键盘事件
目录 一、keydown:按下键盘上的任意键时触发。 二、keyup:释放键盘上的任意键时触发。 三、keypress:在按下并释放能够产生字符的键时触发(不包括功能键等)。 四、input:在文本输入框或可编辑元素的内容…...
opengl灯光基础:2.1 光照基础知识
光照: 光照以不同的方式影响着我们看到的世界,有时甚至是以很戏剧化的方式。当手电筒照射在物体上时,我们希望物体朝向光线的一侧看起来更亮。我们所居住的地球上的点,在中午朝向太阳时候被照得很亮,但随着地球的自转…...
大屏时代:引领信息可视化的新潮流
在信息时代的浪潮下,数据已经成为推动各行各业发展的重要动力。然而,海量的数据如何快速、直观地呈现给用户,成为了一个亟待解决的难题。在这样的背景下,可视化大屏应运而生,以其出色的表现力和交互性成为信息展示的佼…...
ChatGTP全景图 | 背景+技术篇
引言:人类以为的丰功伟绩,不过是开端的开端……我们在未来100年取得的技术进步,将远超我们从控制火种到发明车轮以来所取得的一切成就。——By Sam Altman 说明:ChatGPT发布后,我第一时间体验了它的对话、翻译、编程、…...
计算机专业学习的核心是什么?
既然是学习CS,那么在这里,我粗浅的把计算机编程领域的知识分为三个部分: 基础知识 特定领域知识 框架和开发技能 基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。 特定领域知识就是你…...
基于springboot地方旅游系统的设计与实现
摘 要 本次设计内容是基于Springboot的旅游系统的设计与实现,采用B/S三层架构分别是Web表现层、Service业务层、Dao数据访问层,并使用Springboot,MyBatis二大框架整合开发服务器端,前端使用vue,elementUI技术&…...
一些学习资料链接
组件化和CocoaPods iOS 组件化的三种方案_迷曳的博客-CSDN博客 CocoaPods 私有化 iOS组件化----Pod私有库创建及使用 - 简书 CocoaPods1.9.1和1.8 使用 出现CDN: trunk URL couldnt be downloaded: - 简书 cocoapod制作私有库repo - 简书 【ios开发】 上传更新本地项目到…...
Webpack打包图片-JS-Vue
1 Webpack打包图片 2 Webpack打包JS代码 3 Babel和babel-loader 5 resolve模块解析 4 Webpack打包Vue webpack5打包 的过程: 在webpack的配置文件里面编写rules,type类型有多种,每个都有自己的作用,想要把小内存的图片转成bas…...
进程控制(Linux)
进程控制 fork 在Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值: 在子进程中返回0,父进程中返回子进程的PID,子进程创建失败返回-1。 …...
C Primer Plus第十四章编程练习答案
学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 由于使用的是命令行参数常用于linux系…...
又名管道和无名管道
一、进程间通信(IPC,InterProcess Communication) 概念:就是进程和进程之间交换信息。 常用通信方式 无名管道(pipe) 有名管道 (fifo) 信号(signal) 共…...
操作系统复习4.1.0-文件管理结构
定义 一组有意义的信息的集合 属性 文件名、标识符、类型、位置、大小、创建时间、上次修改时间、文件所有者信息、保护信息 操作系统向上提供的功能 创建文件、删除文件、读文件、写文件、打开文件、关闭文件 这6个都是系统调用 创建文件 创建文件时调用Create系统调用…...
【嵌入式烧录/刷写文件】-2.6-剪切/保留Intel Hex文件中指定地址范围内的数据
案例背景: 有如下一段HEX文件,保留地址范围0x9140-0x91BF内的数据,删除地址范围0x9140-0x91BF外的数据。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485868788898A…...
JavaScript表单事件(下篇)
目录 八、keydown: 当用户按下键盘上的任意键时触发。 九、keyup: 当用户释放键盘上的键时触发。 十、keypress: 当用户按下键盘上的字符键时触发。 十一、focusin: 当表单元素或其子元素获得焦点时触发。 十二、focusout: 当表单元素或其子元素失去焦点时触发。 十三、c…...
机器学习 | SVD奇异值分解
本文整理自哔哩哔哩视频:什么是奇异值分解SVD–SVD如何分解时空矩阵 📚奇异值分解是什么? M是原始矩阵,它可以是任意的矩阵,奇异值分解就是将它分解为三个矩阵相乘。U和V是方阵,∑是不规则矩阵,…...
用STM32F4做个PWM信号发生器:按键调参+OLED显示,示波器实测验证
用STM32F4打造高精度PWM信号发生器:从原理到实战 在电子开发与测试中,PWM信号发生器是不可或缺的工具。专业信号源价格昂贵,而基于STM32F4的开发板却能以极低成本实现类似功能。本文将带你从零构建一个带OLED显示和按键控制的PWM信号发生器&…...
告别系统臃肿:Win11Debloat三步配置流程让Windows运行效率提升51%
告别系统臃肿:Win11Debloat三步配置流程让Windows运行效率提升51% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...
The-Forge安全实践指南:跨平台渲染框架的终极安全保障方案
The-Forge安全实践指南:跨平台渲染框架的终极安全保障方案 【免费下载链接】The-Forge The Forge Cross-Platform Framework PC Windows, Steamdeck (native), Ray Tracing, macOS / iOS, Android, XBOX, PS4, PS5, Switch, Quest 2 项目地址: https://gitcode.co…...
基于TINA的英飞凌功率MOSFET SPICE瞬态仿真与损耗优化实战
1. 功率MOSFET仿真基础与TINA软件入门 电力电子工程师在设计电源系统时,最头疼的问题之一就是如何准确预测功率MOSFET的损耗。我刚开始接触这个领域时,曾经因为低估了开关损耗导致整个电源模块过热报废,损失惨重。后来发现,TINA-T…...
惠普tank 2606,开机报错 ER-08 ,加了碳粉还是报错ER08,黄灯闪烁成像鼓接近寿命期限,别被维修店坑了,这个软件专门维修这个错误,软件运行一下2分钟搞好。
下载地址:链接:https://pan.baidu.com/s/1J7PN4m4fbIzku9DqBFg_nw?pwd0000 提取码:0000 备用下载:下载 惠普tank 2606系列,tank1005系列,打印机提示错误代码 er-08 ,加了粉还是报错er08,提示没粉,闪黄灯…...
突破限制与全版本支持:MediaCreationTool.bat重新定义Windows安装介质制作
突破限制与全版本支持:MediaCreationTool.bat重新定义Windows安装介质制作 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreatio…...
手把手教你用HuggingFace+BGE模型搭建本地向量检索系统(附FAISS实战代码)
从零构建基于BGE模型的本地语义搜索系统:代码级实践指南 在信息爆炸的时代,如何快速从海量文本中精准找到相关内容?语义搜索技术正成为解决这一痛点的利器。不同于传统的关键词匹配,语义搜索能理解查询背后的意图,找到…...
3个技巧:如何用开源工具彻底解决Beyond Compare授权难题
3个技巧:如何用开源工具彻底解决Beyond Compare授权难题 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 当Beyond Compare 5的30天评估期结束后,用户常常会遇到"评估…...
Pixel Epic应用场景:律所尽调报告辅助生成+法律条文精准引用案例
Pixel Epic应用场景:律所尽调报告辅助生成法律条文精准引用案例 1. 法律行业的数字化挑战 法律尽职调查是并购交易、股权投资等商业活动中的关键环节。传统模式下,律师团队需要: 人工查阅数百页企业资料逐条核对法律法规手工编写数十页的尽…...
AssetRipper终极指南:轻松提取Unity游戏资源的完整教程
AssetRipper终极指南:轻松提取Unity游戏资源的完整教程 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 还在为无法获取Uni…...
