STL体系结构概述

文章目录

    • STL是什么?
    • STL的六大组件
    • STL的实现版本
    • 额外补充
      • 一、容器范围区间
      • 二、容器结构与分类
        • 序列式容器
        • 关联容器
          • 有序关联容器
          • 不定序关联容器
    • 参考

本文将是STL系列的第一篇文章,主要参考《STL源码剖析》,辅以网络博文,不定时更新我感兴趣的内容。

笔者在入门C++这门编程语言的时候之前,就已听腻了这个STL这个词了,特别是在OJ场景下,主要是因为采用这个库就可以避免手撸一些数据结构,有相关数据结构基础就能直接上手了。当然,这都是对STL比较浅显的认知罢了,本系列将开始学习STL的相关知识。

STL是什么?

STLStandard Template Library的缩写,中文译作标准模板库,属于C++标准库的一部分。

STL所实现的,是依据泛型思想架设起来的一个概念结构。这个以抽象概念(abstract concepts)为主体而非以实际类(classes)为主体的结构,形成了一个严谨的接口标准。在此接口之下,任何组件都有最大的独立性,并以所谓的迭代器(iterator)胶合起来,或以适配器(adapter)互相适配,或以所谓仿函数(functor)动态选择某种策略(policy或strategy)。

STL的六大组件

STL提供六大组件,彼此之间相辅相成:

  • 容器(containers):各种数据结构,如vectorlistdequemapset用来存储数据。从实现上来说,STL容器是class template,也就是说它能够支持不同类型的元素(前提是需要满足容器要求)。
  • 算法(algorithms):各种常用算法,如sortsearchcopy等。从实现上来说,它是一种function template
  • 迭代器(iterators):扮演容器与算法之间的胶合剂,是一种“泛型指针”,也可以理解成抽象化的指针,实现上是借助了C++中的操作符重载的特性,所有的STL容器都附带了一套属于自己的专属迭代器。原生指针(native pointer)也是一种迭代器。
  • 仿函数(functiors):行为类似于函数,可作为算法的某种策略(policy)。从实现上来说,其实就是一种重载了operator ()classclass template,比如lambda表达式也是其中一种。
  • 配接器(adapters):适配器,一种用来修饰容器(containter)或仿函数(functiors)或迭代器接口的东西。比如,STL中提供的queuestack是一种容器适配器,底层默认是deque容器。改变functor者,称之为function adapter;改变container接口者,称为container adapter;改变iterator接口者,称为iterator adapter
  • 配置器(allocators):分配器,负责空间的配置和管理。从实现上看,它是一个实现了动态空间配置、空间管理、空间释放的class template

它们之间的关系可以用下图进行表示:

在这里插入图片描述

要理解这张图,需要读者结合上面对六大组件的简单解释来分析,如果还有一些STL使用经历就更好了。

STL的实现版本

在学习C++过程,大家需要理解一个概念就是:我们学习的是一个标准(C++11、C++14、C++17等标准),而具体实现依据不同编译器,标准没规定的就是由编译器自由发挥了。在标准中没规定的东西,不要从某一个编译器实现中看到它的实现方式就说C++对这个一定是这样实现的,这是一种思维误区,这是不对的。

STL实现主要有以下的版本:

  • HP实现的版本:所有STL实现的始祖
  • P.J.Plauger实现的版本:继承于HP版本,被**Visual C++**采用
  • Rouge Wave实现的版本:继承于HP版本,被C++Builder采用
  • STLPort实现的版本:提供一个以SGI STL为蓝本的高度可移植性实现的版本
  • SGI STL实现的版本:同样继承自HP版本,被GCC采用

在侯捷的《STL源码剖析》一书中分析的便是SGI STL实现的版本。一方面,GCCC++的支持性比较高,使用率也比较高,大家平常接触得比较多的也应该是这个版本,分析这个版本的内容,也更好了解GCC;另一方面,SGI STL版本可读性很高,值得学习。

额外补充

一、容器范围区间

容器提供的范围区间一般是遵循前闭后开[)的原则。典型地,就是来自begin()end()函数返回的这两个迭代器所指代的范围:

在这里插入图片描述

begin()返回的迭代器指向了容器元素中的第一个,而end()返回的迭代器则是容器元素中的最后一个的下一个(不存在的元素)。这是一个例子,其他的返回区间,也是遵循这一原则。

二、容器结构与分类

容器主要可以分为两大类:

  • 序列式容器(SequenceContainer):在线性排列中存储相同类型对象的容器
  • 关联容器(AssociativeContainer):提供基于键的快速对象查找的容器
序列式容器

序列式容器底层是采用类似线性表的结构来存储元素

  1. array:于C++11标准引入,功能等同于传统数组,但它不会退化为指针,还能提供容器相关的操作
  2. vector:封装动态数组的序列容器,特点是 存储动态管理,尾部扩增,在GCC中,其增长空间是以2倍增长的
  3. deque:双端队列,头尾两端可增可减,内部存储的方式是以分段模拟连续空间(关键靠迭代器),访问元素需要两层指针访问。
  4. list:通常实现为双向链表,支持从容器任何位置进行常数时间的元素插入和移除,不支持随机访问。
  5. forward_list:于C++11标准引入,通常实现为单链表,支持从容器中的任何位置快速插入和移除元素的容器,不支持随机访问。

序列式容器不止上述这些,随着新标准的引入,相信也会有新的容器加入到STL中,建议关注:cppreference.com

关联容器
  • 有序关联容器:底层通常采用红黑树实现
  • 不定序关联容器:底层通常采用哈希表哈希表实现
有序关联容器
  1. set:只存储Key类型的对象,有序,Key唯一
  2. multiset:只存储Key类型的对象,有序,Key允许重复
  3. map:存储键值对,有序,Key唯一
  4. multimap:存储键值对,有序,Key允许重复
不定序关联容器
  1. unordered_set:只存储Key类型的对象,无特别的顺序,只是组织到桶中,依赖hash值,Key唯一
  2. unordered_multiset:只存储Key类型的对象,无特别的顺序,只是组织到桶中,依赖hash值,Key允许重复
  3. unordered_map:存储键值对,无特别顺序,只是组织到桶中,依赖hash值,Key唯一
  4. unordered_multimap:存储键值对,无特别顺序,只是组织到桶中,依赖hash值,Key允许重复

当然,关联式容器也不止这些,这里只是简单做个介绍。

参考

  • 容器库 - cppreference.com
  • STL源码剖析 (豆瓣) (douban.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DevC++ easyx实现图片拖动,一种悬浮窗实现原理与完整代码

翻出来之前写的代码, EasyxDevC开发地图编辑和游戏编辑代码工程文件附注释_哔哩哔哩_bilibili 每次把代码备份下来,等着有一天能够复用代码,产生新的价值。 结果最近这几天才来回顾记录emm “这是怎么搓出来的?”从10行代码到…

代码审查工具FishEye详细使用教程

1. Git代码仓库设置 1、登录并进入到FishEye主页面,点击Repositories进入仓库管理页面,如下图: 2、填写仓库信息,如下图: 3、填写Git地址 http://gitAccount:gitPwd118.24.231.166:8080/git/git/iot-lvdao/iot-dhcc.…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路, 一种是通过wind.open()方法传第二个参数, A页面: //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值,代表跳转页面都为music标签页&#xff0…

计算机服务器中了halo勒索病毒如何解密,halo勒索病毒解密数据恢复

计算机技术的不断发展,为企业的生产运营提供了极大便利,但也为网络安全埋下隐患,网络上的勒索病毒种类也在不断增加,给企业的数据安全带来了严重威胁。近日,云天数据恢复中心接到许多企业的求助,企业的计算…

Unity3D移动端实现摇一摇功能

手机摇一摇功能在平时项目开发中是很常见的需求,利用Unity的重力感应可以很方便的实现该功能。 Unity简化了重力感应的开发, 通过访问Input.acceleration属性,取回加速度传感器的值。首先我们看一下重力传感器的方向问题。Unity3D中重量的取…

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存(通常是动态分配的堆内存),但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源,持续的内存泄漏还导致系统内存的逐渐耗尽,最…

【Linux】进程周边007之进程控制

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.进程创建 2.进程终止 2.…

python调用DALL·E绘画

实现用gpt的api和他对话后,我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度,所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度,子元素会按比例来划分宽度。在使用弹性盒子模型之前,必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

Linux笔记本电脑投屏到电视,用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上,可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先,在Linux系统的电脑里用chrome浏览器或edge浏览器打开网址webcast.airdroid.com。这个网址就是AirDroid Cast的网页版。你可以看到中间白色框框的…

一文搞懂 java8 reduce操作

什么是 reduce Java8 中有两大最为重要的改变,其一是 Lambda 表达式,另一个就是 Stream API 了。 Stream 是 Java8 中处理集合的关键抽象概念,它将数据源流化后,可以执行非常复杂的查找、过滤和映射数据、排序、切片、聚合统计等…

中国化妆品头部企业环亚集团携美肤宝、法兰琳卡、滋源、肌肤未来等“新朋友”加入实在智能数智生态圈

广州环亚化妆品科技股份有限公司(以下简称“环亚集团”)是一家综合性美容化妆品高新技术企业,旗下拥有美肤宝、法兰琳卡、滋源、肌肤未来等多个品牌,产品涵盖洁肤护肤、洗护发、身体护理、精油等多个领域。在中国、澳大利亚、美国…

27 redis 的 sentinel 集群

前言 redis 的哨兵的相关业务功能的实现 哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线 然后做 failover 的相关处理, 重新选举 master 节点 我们这里…

【C++刷题】前缀和

【C刷题】前缀和 一、前缀和1、题目链接2、解析3、代码 二、二位前缀和1、题目链接2、解析3、代码 三、寻找数组的中心下标1、题目链接2、解析3、代码 四、除自身以外数组的乘积1、题目链接2、解析3、代码 五、和为K的子数组1、题目链接2、解析3、代码 六、和可被K整除的子数组…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字:Linux、Bash Shell、shell分类 相关指令:bash、sh、cat Shell的介绍 计算机只能认识(识别)机器语言(0和1),如(11000000 这种)。但是,我们的…

手写MapReduce实现WordCount

水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求分析编写MapReduce实现上述功能Mapper类Reducer类Driver类 查看输出结果 需求 假设有一个文本文件word.txt,我们想要统计这个文本文件中每个单词出现的次数。 文件内容如下…

【内存泄露】记一次内存泄露排查,罪魁祸首是HttpClient

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 很久很久以前,曾经的青葱…
最新文章