C++ [STL-简介]
本文已收录至《C++语言和高级数据结构》专栏!
作者:ARMCSKGT
![]()
文章目录
- 前言
- 正文
- 简介
- 关于STL
- 各种版本
- STL组件
- 容器
- 迭代器
- 配接器(适配器)
- 算法
- 仿函数
- 空间配置器
- STL的重要性
- 学习STL的意义
- 如何学习STL
- STL的缺陷
- 最后
前言
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

正文
简介
关于STL
STL(Standard TemplateLibrary)标准模板库,从根本上说,STL是一些数据结构的集合,因为是组织和存放数据简称为容器,这些“容器”有list、vector、set、map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。
STL包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。
STL作者:亚历山大·斯特潘诺夫(Alexander Stepanov),STL之父,并因此而荣获第一届Dr. Dobb’s 程序设计杰出奖,现在是Adobe公司首席科学家。他曾是康柏电脑公司的副总裁和首席科学家,AT&T实验室副总裁和首席架构师,SGI服务和超级计算机业务首席技术官。
各种版本
- 原始版本
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源码,建议阅读SGI版本。
STL组件
容器
- 序列式容器
-string字符串
-vector顺序表
-array数组
-list链表
-deque双端队列- 关联式容器
-set集合(底层是红黑树)
-map映射(底层是红黑树)
这些容器在实现的基础上通过模板类进行封装,除了string以外,其他容器都支持泛型;关于序列式容器,里面的元素是线性的,而关联式容器里面的元素是有一定关系的,一般为K或KV(key=value)模型。其中一些容器还可以变换成具有其他特性的相同容器,例如wstring宽字符串,multimap多键映射等。
迭代器
- iterator普通迭代器
- const_iterator常量迭代器
- reverse_iterator反向迭代器
- const_reverse_iterator常量反向迭代器
我们知道循环可以称为迭代,当我们遍历一个数组时,既可以用 [ ] 和 数组下标 访问,也可以用 数组首地址 和 偏移量 解引用访问,STL为了统一大部分容器的访问方式,定义了迭代器访问,迭代器可以想象成是对指针的封装,我们使用只需要 解引用 然后 ++ 或就能到任何元素然后进行访问或修改,这样使我们学习STL的成本降低了不少,而且后期很多迭代器都支持 范围for 语法糖,而范围for的实现原理就是基于迭代器的!
迭代器扮演容器与算法之间的胶合剂,是所谓的“泛型指针”;所有STL容器都附带有自己专属的迭代器,原生指针(Native pointer)也是一种迭代器。
配接器(适配器)
- 容器适配器
在STL中,容器适配器有queue队列,stack栈等,这些容器我们在使用C语言时发现其存储结构既可以使用顺序表也可以使用链表,也就是顺序栈,顺序队,链栈和链队列,所以这些容器只需要对某些序列容器进行封装而改变该容器的行为就能实现,且这些容器都具有相同的插入删除例如push_back和pop_back等即可,这样就完成了对象的组合!- 迭代器适配器
基于容器适配器的介绍,我们可以对某个容器进行封装,改变该容器的行为就能实现适配器容器,那么对于迭代器来说,如果我们对普通迭代器进行封装,就能实现反向迭代器,因为我们只需要改变普通迭代器的行为就行了。- 仿函数适配器
仿函数本身就非常厉害,仿函数适配器则可以无限制的创造出各种可能的表达式,关于仿函数的,我们在后面会结合代码进行介绍。
算法
- find查找
- swap交换
- sort排序
- reverse逆置
- 等…
我们在学习数据结构时,算法是必不可少的,增删查改难免需要算法的优化,对于一些固定常用的算法,库中已经帮我们实现了,我们只需要使用algorithm头文件即可,这些算法对于大部分容器都是适配可用的,因为迭代器是统一的,这是当初设计者的巧妙之处,而对于某些特殊的数据结构其算法会在类中实现封装在一起,这样就实现了算法的高效利用!各种常用算法,如Sort,Search,Copy,Erase,从实现的角度来看,STL算法是一种Function Templates。
仿函数
仿函数的实现是通过类中重载 () 运算符实现的,这样我们可用将对象当作函数使用,仿函数的出现使我们的函数作为参数传参更加方便,在C语言qsort中,比较函数需要自己实现和传参,而在C++中只需要传递仿函数对象即可,这样既好理解也方便使用,在C++的一些比较算法和关联式容器中,就需要函数对象控制比较,例如排序的升序和降序通过less和greater仿函数控制,map的建树比较规则也是通过less和greater控制,所以仿函数的地位是不可比拟的!
空间配置器
我们学习动态内存管理时,通过new可用向堆申请空间,使用完毕后delete释放,但是底层其实是C++语言去调用系统接口申请内存,这样在一般的简单使用场景下没有问题,但是对于频繁申请和释放内存时,效率非常低。于是我们可用预先向系统申请一大块空间进行管理,需要空间时去这一大块空间上取,释放时伪释放,这样就不需要总是通过系统接口申请内存了,我们只需要维护好这一大块空间即可,这样就极大的提高了内存使用效率,而这种技术也称为内存池技术,对于频繁申请和释放内存的场景非常实用;STL引入内存池技术也是为了极致的性能发挥!
STL的重要性
学习STL的意义
STL在日常使用的非常之多,其实现原理和里面的一些算法思想非常值得我们去学习,而且在面试时公司必考。网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。
如何学习STL
- 学习STL的使用
- 了解STL的底层实现
- 熟练使用STL甚至扩充STL
简单总结一下:学习STL的三个境界:能用,明理,能扩展 。
STL的缺陷
- STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订;C++11出来已经相隔了13年,STL才进一步更新。
- STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
- STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
- STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。
最后
STL的简单介绍到这里就介绍了,学习和熟练使用STL对于我们的C++学习之路有着极大的帮助,后面我们会对STL中的常用容器进行详细的介绍和实现,相信STL会助力我们更加高效的开发!
本次 <C++ STL-简介> 就先介绍到这里啦,希望能够尽可能帮助到大家。
如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!

🌟其他文章阅读推荐🌟
C++ <模板> -CSDN博客
C++ <内存管理> -CSDN博客
C++ <类和对象 - 下> -CSDN博客
C++ <类和对象 - 中> -CSDN博客
C++ <类和对象 - 上> -CSDN博客
🌹欢迎读者多多浏览多多支持!🌹
相关文章:
C++ [STL-简介]
本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言 STL(standard tem…...
牛客前端编程语言错题2
【语法】 名为“ctx”的变量是某个HTML5画布对象的上下文。以下代码绘制的是什么() Ctx.arc(x,y,r,0,Math.PI,true); 在给定点绘制一个矩形 从一个点到另一个点绘制一条直线 在给定点绘制一个半圆 在给定点绘制一个圆 链接:https://www.now…...
【C语言】基础语法3:控制流程结构
上一篇:运算符和表达式 下一篇:函数和递归 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…...
MySQL安全性:防止攻击和保护数据
MySQL安全性:防止攻击和保护数据 MySQL是当今最流行的关系型数据库之一,然而,随着Internet的普及,数据库安全问题也越来越受到关注。在这篇文章中,我们将重点介绍MySQL的安全性问题,以及如何防止攻击和保护…...
R语言结构方程模型(SEM)
详情点击链接:R语言结构方程模型(SEM)生态学领域应用 一,R语言SEM分析入门:lavaan VS piecewiseSEM 结构方程模型在生态学研究中的应用及模型结构方模型估计方法:局域估计和全局估计的基本工作原理、主要…...
软件or硬件?硬件的前途到底在哪里?
一、硬件明明比软件更难,国内的硬件技术也不如软件,为什么硬件工程师待遇还不如软件? 1、不需要太高层次的硬件设计,比如大部分小家电企业,简单的电子产品企业,单片机简单外围设计就够了,单片机…...
同学在外包干了两年的点点点,24岁人就快废了
前言 简单的说下,我大学的一个同学,毕业后我自己去了自研的公司,他去了外包,快两年了我薪资、技术各个方面都有了很大的提升,他在外包干的这两年人都要废了,技术没一点提升,学不到任何东西&…...
基于Java springboot 疫情在线网课管理系统
博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 一、前言介绍1.1 背景及意义1.2 系统运行环境…...
Unity Camera -- (3)控制相机能看到的东西
使用剪裁平面(Clipping Planes)定义相机可视范围 Clipping Planes定义了相机所能看到的场景范围。在有些时候,限制相机所能看到的范围是出于风格上的考量,但编辑Clipping Planes的主要目的是为了优化性能。相机所需要渲染的东西越…...
《基于深度迁移学习的可穿戴睡眠阶段分类》阅读笔记
一、摘要 佩戴可穿戴设备进行睡眠监测是一种无创、便捷的方法,可以提高睡眠障碍筛查和健康监测的效率。然而,由于缺乏大规模、标准化的PPG数据集,使用PPG进行睡眠阶段分类仍然具有挑战性。本文提出了一种基于深度迁移学习的方法来解决这个问…...
java版工程管理系统源码企业工程项目管理系统简介
一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…...
机器学习算法 决策树
文章目录 一、决策树的原理二、决策树的构建2.1 ID3算法构建决策树2.2 C4.5 算法树的构建2.3 CART 树的创建 三、决策树的优缺点 一、决策树的原理 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总…...
论文笔记:An Interactive-Voting Based Map Matching Algorithm
2010 MDM 1 ST-matching的问题 论文笔记:Map-Matching for low-sampling-rate GPS trajectories(ST-matching)_UQI-LIUWJ的博客-CSDN博客 当轨迹很长,且车辆通过多线平行的道路时,ST-Matching的效果较差,…...
_awt_container容器_演示
Component作为基类,提供了如下常用的方法来设置组件的大小、位置、可见性等。 方法签名方法功能setLocation(int x,int y)设置组件的位置setSize(int width,int heigth)设置组件的大小setBounds(int x,int y,int width,int heigth)设置组件的位置,大小。…...
TryHackMe-Misguided Ghosts(boot2root)
Misguided Ghosts 端口扫描 循例nmap FTP枚举 直接登anonymous,有几个文件,下下来 info.txt 我已经包含了您要求的所有网络信息,以及一些我最喜欢的笑话。- 帕拉摩尔该信息可能指的是pcapng文件 jokes.txt Taylor: Knock, knock. Josh: …...
【Leetcode】10. 正则表达式匹配
10. 正则表达式匹配(困难) 题解 如果从左向右进行匹配的话,需要考虑字符后是否有 * 。 因此选择从右向左扫描更为简单。 *前面肯定有一个字符,它像是一个拷贝器,能够复制前面的单个字符,甚至也可以把这个…...
不得不说的结构型模式-装饰器模式
目录 装饰器模式是什么 下面是装饰器模式的一个通用的类图: 以下是使用C实现装饰器模式的示例代码: 下面是面试中关于桥接器模式的常见的问题: 下面是问题的答案: 装饰器模式是什么 装饰器模式是一种结构型设计模式ÿ…...
Flutter+YesAPI 快速构建零运维的APP
前言 移动互联网经过多年的发展,已经进入一个成熟的阶段,几乎每个公司都有自己的移动应用程序或移动网站。随着5G技术的不断发展,也带来了更高效的数据传输速度和更稳定的网络连接,这使得更多的应用程序和服务能够在互联网上运行&…...
使用Socks5代理保障HTTP传输的网络安全
一、引言 在互联网时代,网络安全越来越受到人们的关注,特别是在数据传输过程中,很容易出现信息泄露、窃听等安全问题。为了保障网络传输的安全性,我们可以使用代理服务器来进行传输,而Socks5代理是其中一种常用的代理…...
C语言入门篇——操作符篇
目录 1、操作符分类 2、操作符的属性 3、算术操作符 4、移位操作符 5、位操作符 6、赋值操作符 7、单目操作符 8、关系操作符 9、逻辑操作符 10、条件操作符 11、逗号操作符 12、下标引用、函数调用和结构成员 1、操作符分类 算术操作符(,-&…...
软考高项案例分析8:项目风险管理
软考高项案例分析8:项目风险管理 一、项目风险管理过程 1、规划风险管理; 2、识别风险; 3、实施定性风险分析; 4、实施定量风险分析; 5、规划风险应对; 6、实施风险应对; 7、监督风险; 二、案例分析知识点 1. 风险应对措施 威胁应对策略:上报、规避、转移、…...
ElevenLabs陕西话语音落地实录:从零配置API到高保真秦腔语调还原,7步搞定方言TTS部署
更多请点击: https://kaifayun.com 第一章:ElevenLabs陕西话语音落地实录:从零配置API到高保真秦腔语调还原,7步搞定方言TTS部署 环境准备与API密钥获取 首先注册ElevenLabs账号并进入 Profile → API Keys页面,生成…...
Zygo测试驱动开发实践:如何为解释器编写可靠的测试套件
Zygo测试驱动开发实践:如何为解释器编写可靠的测试套件 【免费下载链接】zygomys Zygo is a Lisp interpreter written in 100% Go. Central use case: dynamically compose Go struct trees in a zygo script, then invoke compiled Go functions on those trees. …...
5分钟学会AnyFlip电子书一键下载:免费PDF转换终极指南
5分钟学会AnyFlip电子书一键下载:免费PDF转换终极指南 【免费下载链接】anyflip-downloader Download anyflip books as PDF 项目地址: https://gitcode.com/gh_mirrors/an/anyflip-downloader 你是否曾经在AnyFlip上找到一本精彩的电子书,想要永…...
CellSpectra的创新视角:从差异表达到协调性分析
单细胞RNA测序(scRNA-seq)让我们得以在单细胞分辨率下解析基因表达模式。然而,差异表达分析仅能识别单体基因变化,难以刻画基因间的协同调控;通路富集分析无法实现个体水平的统计推断;高稀疏性则进一步制约…...
今日算法(构造二叉搜索树)
题目描述给你一个整数数组 nums,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树(BST)。平衡二叉搜索树:左右两个子树的高度差的绝对值不超过 1每个节点的左右子树都是平衡二叉树二叉搜索树的中序遍历结…...
Python小白也能学会!3个月蜕变AI应用开发者的收藏秘籍
本文针对程序员,特别是只会CRUD的开发者,提供了学习大模型的实用路径。文章强调大模型应用开发是“低门槛、高上限”的方向,并给出了一个12步学习路线,涵盖Python基础、Transformer理解、提示词工程、RAG等,以及LangCh…...
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前言 产品经理和开发之间的矛盾,根源往往不在需求本身,而在于需求表达方式。一个合格的需求文档应该包含:功能描述、业务规则、边界条件、异常处理、验收标准。但现实中,很多PRD长这样:“用户点击支付后,系…...
4.0修复版去水印小程序源码 内含去水印免费接口
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 流量主变现:集成微信广告,支持开屏 / 激励 / Banner 广告,直接盈利。 前后端能力: 前端:3 套 UI 可选,改版后功能完…...
别再复制粘贴了!手把手教你用Git命令将本地项目一键推送到GitLab仓库(含常见错误解决)
从零掌握Git命令流:本地项目高效同步GitLab全指南 在代码协作开发中,Git已成为不可或缺的版本控制工具。尽管现代IDE提供了便捷的图形化Git操作界面,但真正理解并熟练运用Git命令行,才是开发者摆脱"界面依赖症"、深入掌…...


