C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件

article/2025/6/19 12:52:16

文章目录

前言

一、什么是STL

二、STL的版本

1、原始版本

2、P.J.版本

3、RW版本

4、SGI版本

三、闭源、开源

四、STL的六大组件

总结


前言

路漫漫其修远兮,吾将上下而求索;


一、什么是STL

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

注:标准库指的是C++所有官方实现的库;而STL(标准模板库),用模板去实现常见的数据结构与算法;C++之中提供的标准库中提供数据结构和算法的一套库,以方便我们去使用;

Q:标准库中除了STL还有什么?

  • IO流库、线程库、异常、智能指针……

二、STL的版本

STL(Standard Template Library)的设计与实现并非由C++创始人本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup)直接完成,而是由Alexander Stepanov、David Musser和 Meng Lee在惠普实验室开发。该项目后来以开源方式发布,代码开放给社区,最终被纳入C++标准库,成为现代C++的核心组成部分。STL的核心贡献在于引入了泛型编程范式提供了容器、算法和迭代器的高效抽象,极大提升了C++的灵活性和性能表现。

注:开源有一个开源协议的要求:如果你进行了有效的修改,你也要像原始版本一样开源(不开源的话,别人有权告你);

1、原始版本

Alexander Stepanov 、David Musser、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费;唯一条件就是也需要向原始版本一样做开源使用;HP版本——所有STL实现版本的始祖;

2、P.J.版本

 P.J. Plauger 基于 HP STL 开发了自己的实现,并创立了 Dinkumware 公司来提供商业化的 C/C++ 标准库实现;不能公开或者修改,缺陷:可读性比较差,符号命名比较怪异; Microsoft Visual C++ 长期采用 Dinkumware 的 STL (以及整个 C++ 标准库) 作为其实现基础。直到较新版本的 MSVC (如 VS 2019/2022 的部分版本) 才开始逐步替换为微软自研的实现(但仍有继承关系)

3、RW版本

由Rouge Wage 公司开发,继承自HP版本,被 Borland C++ Builder采用,不能公开或者修改,可读性一般;大概二十年前,Builder 比较出名的,但是后来被微软干掉,没人维护于是就没落了;

4、SGI版本

由Silicon Graputer Systems ,Ins 公司开发,继承自HP版本,被 GNU C++ Library (libstdc++) 采用作为其 STL 部分的基础实现。而 libstdc++ 是 GCC (GNU Compiler Collection) 的默认 C++ 标准库,因此广泛应用于 Linux 系统以及其他使用 GCC 的平台(如早期的 Mac OS X, Cygwin, MinGW 等);SGI版本可移植性好,可公开、修改甚至贩卖,从命名风格和编程风格上看,阅读性非常高。

我们在谈STL这个库的时候需要注意在VS版本下的STL源代码与Linux 下STL的源代码是不一样的;虽然P.J.版本和SGI版本会提供相同的接口,但是其底层实现是不同的(eg. string的扩容方式;在SGI版本中采用2倍扩容,但是P.J.版本是1.5 倍扩容);

三、闭源、开源

需要注意的是,计算机中的源代码分为闭源、开源

  • 闭源由商业公司开发的,其源代码不会对外公布;eg.Windows、mas oc 
  • 开源:eg.Linux、git  开源就意味着免费;因为免费,所以公司的服务器都是部署在Linux 上面;如果公司有一些特殊需求,可以招一些搞内核的人,对操作系统进行一些改造(重写驱动等)

注:Gitub 是利用git 这个开源项目去搭建的网站而形成的一个“社会”;

Q: 闭源与开源分别有什么优缺点?

  • 开源的项目如果不是特别出名,是很难维护起来的,即使比较出名的开源项目可能到一定的阶段就有可能没有多少人去维护;闭源的项目,具有商业性质,会以公司的性质去招募一些人来对这个闭源项目进行维护、发展;不要认为开源一定好,而闭源的不一定好……其实开源和闭源各有各的好处;

四、STL的六大组件

STL的核心是数据结构与算法,但其中又分为了6大组件

其中空间配置器就是内存池;

内存池是给容器使用的;因容器可能会高频地申请释放内存,不建立内存池便会在堆上向操作系统申请空间,而不停地打断操作系统会有严重的效率损失,故而STL给他自己所有的容器统一建立了一个内存池以供其专用以提高这些数据结构申请、释放内存的效率;需要注意的是,部分算法若会高频地申请、释放内存,内存池也会给部分算法使用,eg.归并排序;


总结

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

2、STL在C++的学习中非常重要,需要我们熟练掌握容器接口的使用……


http://www.hkcw.cn/article/AsnkkvXBaN.shtml

相关文章

学习STC51单片机22(芯片为STC89C52RCRC)

记住这个AT指令千万不要去脑子记,要用手册查 每日一言 努力不是为了感动谁,而是为了不辜负自己的野心。 硬件:ESP8266 wife模块 蓝牙,ESP-01s,Zigbee,NB-lot等通信模块都是基于AT指令的设计 老样子 我们用…

华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《统计匹配的二元组个数》:…

LLMTIME: 不用微调!如何用大模型玩转时间序列预测?

今天是端午节,端午安康!值此传统佳节之际,我想和大家分享一篇关于基于大语言模型的时序预测算法——LLMTIME。随着人工智能技术的飞速发展,利用大型预训练语言模型(LLM)进行时间序列预测成为一个新兴且极具…

Unity3D仿星露谷物语开发56之保存角色位置到文件

1、目标 游戏中通过Save Game保存角色位置,当重启游戏后,通过Load Game可以恢复角色的位置。 2、Player对象操作 (1)组件添加 给Hierarchy下的Player组件添加Generate GUID组件。 (2)修改SceneSave.cs脚…

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录(八):AI智能创建书签功能深度解析前言 📝1. AI功能设计思路 🧠1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

【计算机网络】第3章:传输层—概述、多路复用与解复用、UDP

目录 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输:UDP 四、总结 (一)多路复用与解复用 (二)UDP 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输:UDP 四、总结 &#xff08…

leetcode hot100刷题日记——30.两数之和

解答: 方法一:迭代 迭代大致过程就是: 算两条链表的当前位的和,加上上一位留下来的进位,就是新链表的当前位的数字。计算当前的进位。 这样,我们迭代需要的东西是:链表1,链表2&…

飞腾D2000与FPGA结合的主板

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块,采用6U VPX架构,模块装上外壳即为独立整机,方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

Baklib知识中台驱动服务升级

知识中台架构升级路径 在数字化转型背景下,Baklib通过重构知识中台的技术底座与服务体系,形成了分层解耦的模块化架构。该架构以四库体系为核心支撑,通过分布式存储引擎与语义分析算法的深度耦合,实现了多源异构数据的标准化接入…

NHANES指标推荐:ALI

文章题目:A cross-sectional study examining the relationship between the advanced lung cancer inflammation index and prostate cancer 中文标题:一项检查晚期肺癌炎症指数与前列腺癌之间关系的横断面研究 发表杂志:Journal of Health…

Python训练打卡Day38

Dataset和Dataloader类 知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 在遇到大规模数据集时,显存常常无法一次性存储所有数据,所以需要使用分批训练的…

leetcode付费题 353. 贪吃蛇游戏解题思路

贪吃蛇游戏试玩:https://patorjk.com/games/snake/ 问题描述 设计一个贪吃蛇游戏,要求实现以下功能: 初始化游戏:给定网格宽度、高度和食物位置序列移动操作:根据指令(上、下、左、右)移动蛇头规则: 蛇头碰到边界或自身身体时游戏结束(返回-1)吃到食物时蛇身长度增加…

NLP学习路线图(十三):正则表达式

在自然语言处理(NLP)的浩瀚宇宙中,原始文本数据如同未经雕琢的璞玉。而文本预处理,尤其是其中至关重要的正则表达式技术,正是将这块璞玉转化为精美玉器的核心工具集。本文将深入探讨正则表达式在NLP文本预处理中的原理…

【算法】动态规划

一、动态规划的基本思想 动态规划算法与分治法类似,其基本思想也是将待求解的较大规模问题分解为若干个较小的子问题,先求解子问题,再从这些子问题的解得到原问题的解。 但动态规划法有自己的特点。分治法的子问题相互独立,适合动…

设计模式——原型设计模式(创建型)

摘要 本文详细介绍了原型设计模式,这是一种创建型设计模式,通过复制现有对象(原型)来创建新对象,避免使用new关键字,可提高性能并简化对象创建逻辑。文章阐述了其优点,如提高性能、动态扩展和简…

java程序从服务器端到Lambda函数的迁移与优化

source:https://www.jfokus.se/jfokus24-preso/From-Serverful-to-Serverless-Java.pdf 从传统的服务器端Java应用,到如今的无服务器架构。这不仅仅是技术名词的改变,更是开发模式和运维理念的一次深刻变革。先快速回顾一下我们熟悉的“服务…

57、IdentityServer4概述

IdentityServer4是一个基于ASP.NET Core的开源身份认证和授权框架,实现了OpenID Connect和OAuth 2.0协议。它为现代应用程序提供集中式的身份验证和授权服务,支持单点登录(SSO)、令牌颁发与验证、会话管理等功能,广泛应…

2025.5.29 学习日记 docker概念以及基本指令

Docker: Docker 是一种开源的容器化平台,用于快速部署应用程序,实现开发、测试和生产环境的一致性。 一、Docker 核心概念 镜像(Image) 只读的模板文件,用于创建容器,类似虚拟机的镜像&#x…

AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡一、AI大模型基础原理与智能驾驶

AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡 一、AI大模型基础原理与智能驾驶 1.1 AI大模型的核心架构 本内容由优雅草木心为卓伊凡提供技术辅助讲解,毕竟木心目前正在比亚迪。 人工智能大模型是基于深度学习的复杂神经网络系统&#…

企业AI部署热潮下的安全隐忧:速度与安全的博弈

数据来源:企业网D1net 企业AI部署热潮下的安全隐忧:速度与安全的博弈 近年来,生成式人工智能(GenAI)的迅猛发展让企业趋之若鹜。然而,在这场技术竞赛中,不少企业却因盲目追求速度而忽视了安全…