【c++ • STL】初步认识什么是 STL 标准库

article/2025/9/30 19:54:38

  • 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • 💟 作    者:锡兰_CC ❣️
  • 📝 专    栏:从零开始的 c++ 之旅
  • 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪

文章目录

    • 前言
    • 一、初步认识 STL
      • 1、什么是 STL
      • 2、六大组件的交互关系
    • 二、STL 的历史
    • 三、STL 的不同实现版本
      • 1、HP 实现版本
      • 2、P. J. Plauger 实现版本
      • 3、Rouge Wave 实现版本
      • 4、SGI 实现版本
    • 四、STL 的作用

前言

   本文我们将初步认识 STL,了解 STL 的历史,STL 的不同实现版本,以及 STL 的作用。

一、初步认识 STL

1、什么是 STL

   Q:什么是 STL ?
   A: STL 代表着(Standard Template Library),是一个c++程序库,包含了很多在计算机科学领域中常用的基本数据结构和基本算法。STL由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成。

STL 的组成含义
容器各种数据类型,比如vector向量容器 ,list列表容器等
算法各种常用算法,比如sort排序,copy复制
迭代器扮演着容器和算法之间的胶合剂,是所谓的“泛型指针”
仿函数行为类似函数,可作为算法的某种策略,一般函数指针可视为狭义的仿函数
适配器修饰容器或者仿函数或者迭代器接口的东西
内存分配器负责空间配置与管理

2、六大组件的交互关系

   六大组件的交互关系 :容器通过内存分配器取得数据储存空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套接仿函数。

  具体如下图所示

在这里插入图片描述

二、STL 的历史

   被誉为STL之父的 Alexander Stepanov,出生于苏联莫斯科,早在20世纪70年代后半期,他便已经开始考虑,在保证效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,这便是后来泛型化思想的雏形。为了验证自己的思想,他和纽约州立大学教授Deepak Kapur,伦塞里尔技术学院教授David Musser共同开发了一种叫做Tecton的语言。尽管这次尝试最终没有取得实用性的成果,但却给了Stepanov很大的启示;

   在随后的几年中,他又和David Musser等人先后用Schema语言(一种Lisp语言的变种)和Ada语言建立了一些大型程序库。这其间,Alexander Stepanov开始意识到,在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据类型概念所存在的缺陷。Stepanov希望通过对软件领域中各组成部分的分类,逐渐形成一种软件设计的概念性框架;

   1987年左右,在贝尔实验室工作的Alexander Stepanov开始首次采用C++语言进行泛型软件库的研究。但遗憾的是,当时的C++语言还没有引入模板(template)的语法,现在我们可以清楚的看到,模板概念之于STL实现,是何等重要。是时使然,采用继承机制是别无选择的。尽管如此,Stepanov还是开发出了一个庞大的算法库。与此同时,在与Andrew Koenig(前ISO C++标准化委员会主席)和Bjarne Stroustrup(C++语言的创始人)等顶级大师们的共事过程中,Stepanov开始注意到C/C++语言在实现其泛型思想方面所具有的潜在优势。就拿C/C++中的指针而言,它的灵活与高效运用,使后来的STL在实现泛型化的同时更是保持了高效率。另外,在STL中占据极其重要地位的迭代子概念便是源自于C/C++中原生指针( native pointer)的抽象;

   1988年,Alexander Stepanov开始进入惠普的Palo Alto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任Bill Worley所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。项目自建立之后,参与者从最初的8人逐渐减少,最后只剩下两个人–Stepanove本人和Meng Lee。经过长时间的努力,最终,信念与汗水所换来的是一个包含有大量数据结构和算法部件的庞大运行库。这便是现在的STL的雏形(同时也是STL的一个实现版本–HP STL);

   1993年,当时在贝尔实验室的Andrew Koenig看到了Stepanove的研究成果,很是兴奋。在他的鼓励与帮助下,Stepanove于是年9月的圣何塞为ANSI/ISO C++标准委员会做了一个相关演讲(题为"The Science of C++ Programming"),向委员们讲述了其观念。然后又于次年3月,在圣迭戈会议上,向委员会提交了一份建议书,以期使STL成为C++标准库的一部分。尽管这一建议十分庞大,以至于降低了被通过的可能性,但由于其所包含的新思想,投票结果以压倒多数的意见认为推迟对该建议的决定;

   随后,在众人的帮助之下,包括Bjarne Stroustrup在内,Stepanove又对STL进行了改进。同时加入了一个封装内存模式信息的抽象模块,也就是现在STL中的 allocator,它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体平台。在同年夏季的滑铁卢会议上,委员们以80%赞成,20%反对,最终通过了提案,决定将STL正式纳入C++标准化进程之中,随后STL便被放进了会议的工作文件中。自此,STL终于成为了C++家族中的重要一员;

   此后,随着C++标准的不断改进,STL也在不断地作着相应的演化。直至1998年,ANSI/ISO C++标准正式定案,STL始终是C++标准中不可或缺的一大部件;

三、STL 的不同实现版本

   STL的不同实现版本:HP STL,P. J. Plauger STL,Rouge Wave STL,SGI STL,STLport;

1、HP 实现版本

   HP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工作时,和Meng Lee共同完成的,是第一个STL的实现版本;

2、P. J. Plauger 实现版本

   P. J. Plauger STL属于个人作品,由P. J. Plauger本人实现,是HP STL的一个继承版本,因此在其所有头文件中都含有HP STL的相关声明,同时还有P. J. Plauger本人的版权声明。P. J. Plauger是标准C中stdio库的早期实现者,现在是C/C++ User’s Journal的主编,与Microsoft保持着良好的关系。P. J. Plauger STL便是被用于Microsoft的Visual C++中的。在Windows平台下的同类版本中,其性能不错,但是queue组件(队列,一种容器)的效率不理想,同时由于Visual C++对C++语言标准的支持不是很好(至少直到VC6.0为止,还是如此),因此一定程度上影响了P. J. Plauger STL的性能。此外,该版本的源代码可读性较差,你可以在VC的Include子目录下找到所有源文件(比如:C:\Program Files\Microsoft Visual Studio\VC98\Include);

3、Rouge Wave 实现版本

   Rouge Wave STL是由Rouge Wave公司实现的,也是HP STL的一个继承版本,除了HP STL的相关声明之外,还有Rouge Wave公司的版权声明。同时,它也不是开放源码的,因此无法修改和销售。该版本被Borland C++ Builder所采用,你可以在C++ Builder的Include子目录下找到所有头文件(比如:C:\Program Files\Borland\Cbuilder5\Include)。尽管Rouge Wave STL的性能不是很好,但由于C++ Builder对C++语言标准的支持还算不错,使其表现在一定程度上得以改善。此外,其源代码的可读性较好;

4、SGI 实现版本

   SGI STL是由Silicon Graphics Computer System, Inc公司实现的,其设计者和编写者包括Alexander Stepanov和Matt Austern,同样它也是HP STL的一个继承版本。它属于开放源码,因此你可以修改和销售它。SGI STL被GCC(linux下的C++编译器)所采用,你可以在GCC的Include子目录下找到所有头文件(比如:C:\cygnus \cygwin-b20\include\g++\include)。由于GCC对C++语言标准的支持很好,SGI STL在linux平台上的性能相当出色;

四、STL 的作用

   Q:为什么需要 STL 库呢?
   A: 当我们在学习数据结构的时候是不是会经常的写链表、栈、队列等等这样常见的数据结构呢,这些代码使用起来结构都十分相似,只有一些小细节上有所不同,我们可以重复利用已有的实现来完成不同的需求。在STL中几乎提供了所有我们需要的容器,数据结构,算法,可以大大的提升我们代码的复用性。

其他:

更多专栏订阅:

  • 👍 【开卷数据结构】
  • 💛 【备战蓝桥,冲击省一】
  • 💕   从零开始的 c++ 之旅
  • 💖 【OpenCV • c++】计算机视觉

http://chatgpt.dhexx.cn/article/0yDPXOxZ.shtml

相关文章

STL库:list

STL库:list 文章目录 STL库:list1.STL库对list的官方介绍2.list的常用接口2.1 list的构造函数2.2 list的迭代器与遍历操作2.3 list的容量操作2.4 list的访问操作2.5 list的修改操作2.6 list的特别容器操作 3.list的底层源码4.list的模拟实现4.1 list的结…

STL库:string

STL库:string 文章目录 STL库:string1.STL库对于string类的介绍2.string常用接口的掌握2.1 string的构造接口2.2 string的容量操作接口2.3 string的访问操作接口2.4 string的迭代器遍历操作接口2.5 string的修改操作接口2.6 string的非成员函数重载接口2…

C++ 标准模板库STL

目录 前言 一、STL简介 二、STL的组件 三、STL头文件与命名空间 四、STL三大组件之 —— 容器 4.1 容器概述 4.2 序列式容器 4.3 排序式容器 4.4 哈希容器 五、STL三大组件之 —— 迭代器 5.1 迭代器概述 5.2 五种迭代器 5.3 迭代器的定义 5.4 迭…

C++ - STL标准库

1.C STL标准库简介 长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西” 的方法,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种 组件&…

STL库--概述

C标准模板库(Standard Template Library,STL)是泛型程序设计最成功的实例。STL是一些常用数据结构和算法的模板的集合。 STL六大组件: 容器(containers):存放数据 算法(algorithms)&…

Standard Template Library(STL,标准模板库)

Standard Template Library(STL,标准模板库) STL(标准模板库)是C标准程序库的核心,它深刻影响了标准程序库的整体结构。 STL是一个泛型(generic)程序库,提供一系列软件方案,利用先进,高效的算…

pyqt学习笔记

pyqt学习笔记 文章目录 pyqt学习笔记前言pyqt主要模块开发环境安装qtpython选择使用anaconda集成版本:anaconda的特点:安装步骤: pycharm导入anaconda:pycharm设置qtdesigner,ui转py工具: 前言 gui学习是一个比较重要的内容&…

[ PyQt入门教程 ] PyQt5开发环境搭建和配置

PyQt5工具可以快速实现简单的界面开发,包括界面设计、布局管理以及业务逻辑实现(信号与槽)。简单说就是使用PyQt5工具可以快速画一个控件摆放整齐、界面整洁有序、布局合理的界面。 课程目标 可以动手实现简单的GUI程序。系列文章主要以动手…

PyQt(QtDesigner+Python)编写程序的使用教程(简单版)

有同学问我具体怎么实现QtDesignerPython,简单写一下方便查看 1.安装好后Qtdesinger,打开软件,操作控件设计好想要的界面; 2.将Qtdesinger编写的.ui文件,使用PyUIC(需要自己安装配置好)软件转到.py文件 …

Python开发:PyQT安装教程

不管开发什么程序,一个友好的用户界面都是至关重要的,然而Python自身并没有集成GUI,但是好在自Python诞生之日起,就有许多优秀的GUI工具集被整合到Python当中,使得Python也可以在图形界面编程领域大展身手。所以从这一…

PyQt5学习教程

介绍 Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command…

PyQt完整入门教程 | 例程附代码

关注、星标公众号,直达精彩内容 来源:cnblogs 作者:lovesoo 1、GUI开发框架简介 pyqt是个好东西,可以做完整的测试方案、脚本、工具进行整合复用等等,本文将以一个实例和大家一起分享。先给自己挖个坑开个头&#xff0…

PyQt初级教程

PyQt5简介 这是一个PyQt5的入门教程.目的是帮助你使用PyQt5.本教程创建并在Linux上测试.PyQt4教程则覆盖了PyQt4,对应Python的2.x和3.x的Qt4的库. 原作地址:http://zetcode.com/gui/pyqt5/ 原翻译地址 :http://blog.csdn.net/neverstop_2009/article/c…

PyQt4入门教程(2)_PyQt4的第一个程序

注:文中译者的话将用方括号【】标出。 这一部分我们将学习PyQt中一些基本的函数。 一个简单的例子 这是一个能够显示出一个窗口的简单例子。目前为止我们已经可以对这个窗口干很多事情了,比如说改变它的尺寸,最大化,最小化………

一、PyQt基础知识

一、基础知识 (一)简介 1. 什么是PyQt5 PyQt是基于Digia公司强大的图形程序框架Qt的Python接口,由一组Python模块构成,它是一个创建GUI应用程序的工具包,由Phil Thompson开发。 自从1998年首次将Qt移植到Python上形…

PyQt完整入门教程

https://blog.csdn.net/baidu_37503452?spm1000.2115.3001.5343 1、GUI开发框架简介 19年来,一直在做Android ROM相关测试,也有了一定的积累;20年,计划把之前完整的测试方案、脚本、工具进行整合复用。 第一期计划是开发一个GUI的…

PyQt上手教程汇总

根据此前的PyQt学习,这里对PyQt的学习过程进行最后的总结 前文链接:由于前文标题名字取了一样的,以下内容按照前后顺序排列 (1)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客 (2)PyQt上手教程(一)_机械刘…

pyqt基础教程

PYQT是python版本的QT界面程序包,大家写过C、C#都做过界面设计,python也一样,非常简单。跟着我的思路走,五分钟学会! 1、主体框架先造一个窗口 以下程序直接抄过去。 以下程序直接抄过去。 以下程序直接抄过去。 #!…

Mac 下安装pip,卸载pip方法

mac下直接安装pip和卸载pip的方法如下: 1、pip的安装: 输入 sudo easy_install pip 就可以安装 pip 了。 验证pip安装是否成功: 输入:pip 结果找不到文件。 尝试输入:pip3 -V 或者 pip3 则说明已经安装成功了。 …