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

news2024/9/28 9:21:22

  • 🚀 个人简介: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://www.coloradmin.cn/o/546556.html

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

相关文章

html网页制作(一)基础

之前做web的时候发现,有些页面的源代码,我都不能,完全看懂,所以就像学习一下 一.html是什么? HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格…

深入浅出JWT

什么是JWT? JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Js…

chatgpt赋能Python-python3__2

Python3 中的位运算符 在 Python3 中&#xff0c;位运算符是用来执行二进制位操作的操作符。这些操作符允许我们对二进制位进行一些有用的操作&#xff0c;如位移、按位与、按位或、按位取反等。 在本文中&#xff0c;我们将介绍 Python3 中的位运算符 <<&#xff0c;也…

查看电脑的BIOS版本的五种方法

查看主板BIOS版本的五种方法 概述1. 在 BIOS 中查看2. 使用 DirectX 诊断工具3. 使用 CPU-Z 中查看4. 在 CMD 中查看&#xff08;一&#xff09;5. 在 CMD 中查看 &#xff08;二&#xff09;结束语 概述 BIOS是 Basic Input Output System 的缩略词&#xff0c;直译就是 **基…

Packet Tracer – VLAN 实施故障排除场景 2

Packet Tracer – VLAN 实施故障排除场景 2 拓扑图 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 S1 VLAN 56 192.168.56.11 255.255.255.0 不适用 S2 VLAN 56 192.168.56.12 255.255.255.0 不适用 S3 VLAN 56 192.168.56.13 255.255.255.0 不适用 P…

chatgpt赋能Python-python3调用摄像头

Python3调用摄像头&#xff1a;介绍和实践 Python3 是一种高级编程语言&#xff0c;具有易学易用、支持多种编程方式和跨平台的优点&#xff0c;成为了科学计算、数据分析和人工智能等领域的常用语言。本篇文章将介绍如何使用Python3调用摄像头&#xff0c;并提供实践代码供读…

计算机网络 - 应用层

Application Layer Network Application 的架构 client-server 最常见的架构, 比如上淘宝, google drive都是客户端-服务器的架构 P2P 很多下载软件用的是这个架构, 比如BitTorrent Web and HTTP Overview 是一个超文本传输的协议, 客户端请求, 服务器响应, 发送对象的We…

【野火启明_瑞萨RA6M5】按键输入检测

文章目录 一、GPIO输入——按键输入检测二、硬件设计三、软件设计下载验证 一、GPIO输入——按键输入检测 按键检测原理 按键机械触点断开、闭合时&#xff0c;由于触点的弹性作用&#xff0c;按键开关不会马上稳定接通或一下子断开&#xff0c;使用按键时会产生 下图中的带波…

城市内涝的原因是什么?城市内涝监测预警系统有什么作用?

城市内涝是指在城市地区发生的、由于降雨或其他水源无法迅速排出而引起的洪水现象&#xff0c;城市内涝是城市发展过程中面临的重要挑战之一。本文着重为大家介绍城市内涝的原因&#xff0c;以及城市内涝监测预警系统的作用。 一、城市内涝的原因是什么? 1、排水系统不完善&am…

【基础6】存储过程的 创建与调用

目录 什么是存储过程 用户自定义存储过程 练习 什么是存储过程 什么是存储过程 类似于C语言中的函数。用来执行管理任务或应用复杂的业务规则存储过程可以带参数&#xff0c;也可以返回结果存储过程可以包含数据操纵等语句、变量、逻辑控制语句等。&#xff08;单个select语…

QT窗体绘图QPainter

QPainter INSCODE AI 创作助手&#xff1a; QPainter是Qt中的一个类&#xff0c;用于在窗口、图像或其他用户界面上绘制图形和文本。它提供了一些方便的方法来画线、矩形、圆、多边形和文本 QPainter绘图函数 INSCODE AI 创作助手&#xff1a; QPainter是Qt中一个用于绘图的类&…

MATLAB开发中的常见问题和解决方法:如何解决常见的性能和bug问题

章节一&#xff1a;引言 在MATLAB开发中&#xff0c;经常会遇到一些常见的性能和bug问题。这些问题可能导致程序运行缓慢、结果不准确或者甚至崩溃。本文将介绍一些常见问题&#xff0c;并提供解决方法和案例&#xff0c;帮助开发者更好地应对这些挑战。 章节二&#xff1a;性…

chatgpt赋能Python-python3多行输入

Python3多行输入教程&#xff1a;如何让你的输入更加高效 Python3是一种功能强大、易于学习的编程语言&#xff0c;被广泛应用于科学计算和数据分析领域。但是&#xff0c;对于初学者来说&#xff0c;输入数据可能是一个有些棘手的问题。在本文中&#xff0c;我们将介绍如何使…

chatgpt赋能Python-python3拷贝文件

Python3 拷贝文件方法及注意事项 拷贝文件在日常开发中是一项基本的操作。Python3作为一门既简洁又强大的编程语言&#xff0c;也提供了丰富的文件操作函数。在本篇文章中&#xff0c;我们将介绍如何使用Python3拷贝文件以及需要注意的细节。 为什么要拷贝文件&#xff1f; …

RHCE--openlab搭建网站

--作业要求-- 综合练习&#xff1a;请给openlab搭建web网站 ​ 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#x…

积水监测用什么传感器?道路积水监测设备

近年来&#xff0c;由于全球气候变化导致极端天气频发&#xff0c;在暴雨的侵袭下&#xff0c;许多城市都面临路面积水严重的问题&#xff0c;道路积水是道路交通安全和行车舒适度的一大威胁&#xff0c;给司机和行人带来了巨大的安全隐患。 如何解决道路积水问题? 1、强城市排…

ChatGPT又一重磅更新 - iOS官方App发布

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

余压传感器(探测器)最重要的两个功能是什么?

余压传感器&#xff08;探测器&#xff09;是什么&#xff1f; 余压传感器&#xff08;探测器&#xff09;主要用于测量两个位置之间的压差。 余压传感器&#xff08;探测器&#xff09;的作用&#xff1f; 流量测量&#xff1a;在管道中&#xff0c;通过测量两点之间的压差&…

头歌计算机组成原理实验—运算器设计(11)第11关:MIPS运算器设计

第11关&#xff1a;MIPS运算器设计 实验目的 学生理解算术逻辑运算单元&#xff08;ALU&#xff09;的基本构成&#xff0c;掌握 Logisim 中各种运算组件的使用方法&#xff0c;熟悉多路选择器的使用&#xff0c;能利用前述实验完成的32位加法器、 Logisim 中的运算组件构造指…

基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别]

基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别] 0. 前言1. 确定GPIO引脚2. 触发函数(不带消抖)3. 触发函数(带消抖)4. 长按和短按识别5.其他FreeRtos文章 0. 前言 这一节我们来学习使用按键操作。包括带消抖和不带消抖。 由于之前已经学习过FreeR…