08.STL简介

news2024/10/5 5:47:35

1. 什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的
组件库,而且是一个包罗数据结构与算法的软件框架

2.发展历史

1. 起源与早期探索(20世纪80年代初期):
- STL最早由美国计算机科学家Alexander Stepanov在20世纪80年代初期提出。当时他在惠普(Hewlett-Packard)公司的实验室工作,认为程序员需要一种通用的编程模式来更方便地实现各种数据结构和算法,于是开始着手设计一种新的C++库,这便是STL的雏形。

2. 初步形成与发展(1988 - 1994年):
- 1988年惠普公司开始了C++标准模板库的相关工作。在这一时期,STL的基本框架和核心组件逐渐形成,包括容器、算法和迭代器等。这些组件的设计旨在提供高效、通用的数据结构和算法实现,大大简化C++程序的开发。
- 早期的STL最初被称为SGI STL(Silicon Graphics Inc. STL),包含了容器、迭代器、算法、函数对象等组件。其设计理念和实现方式为后来STL的标准化奠定了基础。

3. 标准化(1998年):
- 由于STL在C++社区中的广泛应用和认可,1998年它正式被纳入C++标准库中,成为C++标准的一部分。这一事件标志着STL的成熟和稳定,使其成为C++程序员必备的工具之一。标准化后的STL在不同的编译器和平台上具有更好的可移植性和兼容性,进一步推动了其广泛应用。

4. 后续的扩展和优化:
- C++11标准及以后:随着C++标准的不断更新,STL也不断得到扩展和优化。例如,C++11标准中新增了多线程支持,STL中的一些容器和算法也进行了相应的改进和扩展,以适应新的编程需求。同时,在容器、迭代器、算法等方面也有了更多的功能增强和性能优化。
- 开源社区的贡献:一些开源社区也为STL的发展做出了重要贡献,提供了STL的优化版本和扩展。例如,Boost库中的一些组件与STL相互补充,为C++程序员提供了更多的选择和功能。
总的来说,STL的发展历程是一个不断完善和拓展的过程。它的出现和发展为C++程序员提供了强大的工具,极大地提高了程序开发的效率和性能,并且对软件开发的标准化和规范化产生了积极的影响。

3. 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 要阅读部分源代码,主要参考的就是这个版本

4.STL的六大组件

STL的六大组件分别是:
 
1. 容器(Containers):
用于存放数据的各种数据结构实现,比如 vector (动态数组)、 list (双向链表)、 deque (双端队列)、 set (集合)、 map (映射)等。从实现角度来看,STL 容器是一种类模板。容器可分为序列式容器和关联式容器。序列式容器中的每个元素均有固定的位置,取决于插入时机和地点,和元素值无关,例如 vector 、 deque 、 list ;关联式容器中元素的位置取决于特定的排序准则以及元素值,和插入次序无关,例如 set 、 multiset (允许重复值的集合)、 map 、 multimap (允许重复键值对的映射)。

2. 算法(Algorithms):提供了各种常用的算法操作,例如排序( sort )、查找( find )、拷贝( copy )、遍历( for_each )等。从实现的角度来看,STL 算法是一种函数模板,可以对容器中的元素进行各种操作和处理。

3. 迭代器(Iterators):连接容器和算法,是一种类似指针的对象,它提供了对容器中元素的访问方式。迭代器共有五种类型,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。不同类型的迭代器支持不同的操作,其功能和使用场景也有所不同。所有 STL 容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针在一定程度上也可看作是一种迭代器。

4. 仿函数(Function Objects):也称为函数对象,行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了 operator() 的类或类模板。比如,在排序算法中,可以通过定义一个仿函数来指定自定义的比较规则。

5. 适配器(Adapters):这是一种用来修饰容器、仿函数或迭代器接口的组件,它可以改变原有组件的接口或行为,以满足特定的需求。例如, stack (栈)和 queue (队列)就是通过适配器将 vector 或 deque 等容器适配成特定的数据结构。迭代器适配器可以使迭代器的行为发生改变,比如反向迭代器。

6. 空间配置器(Allocators):负责空间的配置与管理,用于为容器等对象分配内存空间。它封装了内存分配和释放的操作,将算法与具体的内存模型解耦,提高了程序的可移植性。
如果想要深入了解,可以推荐阅读下面几本书:

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

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

相关文章

可变形卷积(Deformable Convolution)是什么?

普通卷积 普通卷积(dilation1) 普通卷积就是特征图与卷积核的权重W相乘再求和 y(p0​) 表示输出特征图在位置 p0​ 的值。𝑥(𝑝0𝑝𝑛)表示输入特征图在位置 pn​ 的值。𝑤(𝑝&…

烟火烟雾检测数据集 9600张 烟雾火焰检测 带标注 voc yolo 2类 烟火数据集 烟雾数据集 烟火检测烟雾检测

烟火检测数据集 9600张 烟雾火焰检测 带标注 voc yolo 烟火检测数据集介绍 数据集名称 烟火检测数据集 (Fire and Smoke Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型(包括YOLOv5、YOLOv6、YOLOv7等)而设计&#x…

malloc源码分析之 ----- 你想要啥chunk

文章目录 malloc源码分析之 ----- 你想要啥chunktcachefastbinsmall binunsorted binbin处理top malloc源码分析之 ----- 你想要啥chunk tcache malloc源码,这里以glibc-2.29为例: void * __libc_malloc (size_t bytes) {mstate ar_ptr;void *victim;vo…

Qt Quick 3D 入门:QML 3D场景详解

随着 Qt 6 的发布,QtQuick3D 模块带来了新的 3D 渲染和交互能力,使得在 Qt 中创建 3D 场景变得更加简单和直观。本文将带您从一个简单的 QML 3D 应用开始,详细讲解各个相关领域的概念、代码实现以及功能特点。 什么是 Qt Quick 3D&#xff1…

C++拾趣——绘制Console中Check Box

大纲 居中显示窗口清屏并重设光标绘制窗口绘制窗口顶部绘制复选项绘制按钮行绘制窗口底部 修改终端默认行为对方向键的特殊处理过程控制Tab键的处理Enter键的处理上下左右方向键的处理 完整代码代码地址 这次我们要绘制复选框,如下图。 居中显示窗口 按照界面库的…

网约班车升级手机端退票

背景 作为老古董程序员,不,应该叫互联网人员,因为我现在做的所有的事情,都是处于爱好,更多的时间是在和各行各业的朋友聊市场,聊需求,聊怎么通过IT互联网 改变实体行业的现状,准确的…

ExcelToWord-Excel套打Word-Word邮件合并工具分享

Excel to Word转换工具分享 在日常工作或学习中,我们常常需要将Excel中的数据导出到Word文档中,以便更好地展示信息。市场上有许多Excel to Word的转换工具,它们各有特色。今天,我们就来推荐几款这样的工具,并探讨一下…

如何使用虚拟机充当软路由

文章目录 前言下载系统把 iso 转为虚拟机使用 VMware 创建虚拟机 前言 很多人需要软路由,但是软路由需要设备的投入,我这里使用虚拟机充当软路由。省下了设备的投入。不过多花了电费。大家自己取舍吧。 下载系统 ImmortalWrt Firmware Selector 在上…

蓝桥等级考试C++组18级真题-2023-06-18

选择题 1 C L18(15分) 已定义double rate 3.921576;以下可以正确输出变量rate 的是()。 A printf("%d",rate); B printf("%f",rate); C printf("%ld",rate); D printf("%r",rate)&#…

PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)

PhpStudy-PHP5.4.45后门漏洞应用程序(C/base64/winhttp) 前言引言(时间回到多年前) PhpShellCmd.exe使用介绍:(1)输入网址检测是否存在PHP/5.4.45(2)whoami(3…

新闻推荐系统:Spring Boot与大数据

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

IP协议报文

一.IP协议报头结构 二.IP协议报头拆解 1.4位版本 实际上只有两个取值,分别是4和6,4代表的是IPv4,6代表的是IPv6。 2.4位首部长度 IP协议报头的长度也是边长的,单位是*4,这里表示的大小为0~15,当数值为1…

昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化

1. 简介 图像风格迁移是计算机视觉领域中的一个热门研究方向,其中 CycleGAN (循环对抗生成网络) 在无监督领域取得了显著的突破。与传统需要成对训练数据的模型如 Pix2Pix 不同,CycleGAN 不需要严格的成对数据,只需两类图片域数据&#xff0c…

【redis学习篇1】redis基本常用命令

目录 redis存储数据的模式 常用基本命令 一、set 二、keys pattern keys 字符串当中携带问号 keys 字符串当中携带*号 keys 【^字母】 keys * 三、exists 四、del 五、expire 5.1 ttl命令 5.2key删除策略 5.2.1惰性删除 5.2.2定期删除 六、type key的数据类型…

数据结构--线性表(顺序结构)

1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…

【RabbitMQ】RabbitMQ学习

1. 发送流程 生产者 - connection - channel - 交换机 - 对列- channel - connection - 消费者 2. 工作模式 2.1. 简单模式(点对点) 一个消费者一个生产者,直接进行通信。 2.2. 工作对列模式 多个消费者共同消费消息对列中的消息。同一条…

10其他内容补充

如何生成随机数原理详细分析 文章目录 如何生成随机数原理详细分析原理如果使用相同的随机数种子,得到的随机数序列会是相同的吗示例为什么需要随机数种子 动态内存管理前言malloc函数calloc函数realloc函数free函数 - 避免内存泄漏常见的动态内存错误 原理 说到如何生成一个随…

实现TCP Connect的断线重连机制:策略与实践

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 断线重连机制,它成为确保应用在网络不稳定情况下仍能持续提供服务的关键技术之一。本文旨在深入探讨TCP(传输控制协…

浅聊前后端分离开发和前后端不分离开发模式

1.先聊聊Web开发的开发框架Spring MVC 首先要知道,Spring MVC是Web开发领域的一个知名框架,可以开发基于请求-响应模式的Web应用。而Web开发的本质是遵循HTTP(Hyper Text Transfer Protocol: 超文本传输协议)协议【发请求&#xf…

仿RabbitMQ实现消息队列客户端

文章目录 客⼾端模块实现订阅者模块信道管理模块异步⼯作线程实现连接管理模块生产者客户端消费者客户端 客⼾端模块实现 在RabbitMQ中,提供服务的是信道,因此在客⼾端的实现中,弱化了Client客⼾端的概念,也就是说在RabbitMQ中并…