C++ STL简介

news2024/10/5 15:33:42

文章目录

  • 前言
  • 一、STL概述
  • 二、STL历史
  • 三、STL六大组件功能与运用


前言

对C/C++学习感兴趣的可以看看这篇文章哦:C/C++教程

一、STL概述

在软件行业,一直都希望建立一种可以重复运用的东西和一种可以制造出“可重复使用的东西”的方法,来让程序员的心血不至于随着时间迁移而烟消云散

子程序、程序、函数、类别、函数库、类别库、各种组件、结构化设计、模块化设计、面向对象设计、模式

以上所有无一不是软件工程为这一目标的的奋斗史,为的就是提升代码的复用性

而复用性必须要建立在某种标准之上

为了建立数据结构和算法的一套统一标准,并且降低其耦合,提升各自的独立性、弹性、交互性操作,C++社区诞生了STL。

STL的价值主要在两个方面:

  1. 就低层次而言,STL带给我们一套极具实用性的零部件,以及一个整合的组织
  2. 就高层次而言,STL还带给我们一个高层次、以泛型思维为基础的、系统的、条理分明的“软件组件分类学”

STL是一个抽象概念库,这些抽象概念包括:

  • 可被复制
  • 默认构造
  • 可判断是否相等
  • 可比较大小
  • 具有输入功能的迭代器
  • 具有输出功能的迭代器
  • 单向/双向迭代器
  • 随机存取迭代器
  • 一元函数
  • 二元函数
  • ……

STL的创新在于具体的叙述了这些抽象概念,并加以系统化

即:STL实现的是以抽象概念为主体的结构,而不是我们常见的具体的class

进而形成了严谨的接口标准,在这样的接口下,任何组件都有最大的独立性,并用迭代器胶合起来、或用适配器互相配接、或以仿函数动态选择某种策略

C++的类允许我们自定义类别,其模板允许我们将类别参数化,这两者的结合通过traits编程技法,成就了STL

二、STL历史

STL是由Alexander Stepanov创建于1979年前后,当时也是C++诞生的年代(1983年)

没想到吧,STL甚至比C++诞生的还早

在1993年,Alexander Stepanov带着它一手创建的STL,与C++标准委员会有了第一次接触

当时Alexander Stepanov给C++标准委员会作了一个演讲,讲题是:The Science of C++ Programming

从该讲题的名字也能看出,其理论性很强,但却很受欢迎

之后便顺利的提交了相关提案到委员会,最后也以80%的赞成,成功进入C++标准化的正式流程

其影响非常巨大,比如C++原本就有的stream,string等也都用模板重新写了一遍,至此,C++中几乎到处都是模板

三、STL六大组件功能与运用

STL共给我们提供了六大组件,彼此可以组合套用

  1. 容器:各种数据结构,比如常见的vector、list、set、map等等,用于存放数据
  2. 算法:各种常用的算法,比如sort、search、copy、erase,从实现角度来看,STL算法是一种函数模板
  3. 迭代器:其扮演着容器与算法之间的胶合剂,即“泛型指针”,共有5种类型,从实现角度看,迭代器是一种将各类指针相关的操作进行重载的类模板,所有容器都附带自己专属的迭代器

因为只有设计者才知道怎么遍历自己的元素

  1. 仿函数:行为类似函数,可作为算法的某种策略,从实现角度看,仿函数是一种重载了()的类或类模板
  2. 配接器:一种用于修饰容器或仿函数或迭代器接口的东西,比如STL中的queue与stark,虽然看似容器,其实是容器适配器,因为它们底层完全由deque来完成
  3. 配置器:负责控件配置和管理,从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的类模板

六大组件之间的关系为:容器通过配置器取得内存,算法通过迭代器存取容器中的内容,仿函数可以协助算法完成不同的策略变化,而适配器这可以修饰或套接仿函数

目前STL已经是C++标准程序库的一大组成部分,因此所有的C++编译器都一定持有一份STL源码,就在各个C++头文件中

STL并非以二进制程序出现,而是直接提供源代码

按C++标准,所有的标准头文件都不在有扩展名,比如C中常见的.h,但或许是为了兼容,一些STL版本两种类型的头文件都存在

比如在VS中,就可以很方便的查看其源码:

在这里插入图片描述
不过没有一定的功力,其源码应该是很难看得懂的

但对于我们C/C++开发者而言,并没有太大的必要去弄懂STL源码

想要了解STL方方面面的内容如何使用,可以参照我的另一篇文章:STL详解

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

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

相关文章

什么是基于模型设计(MBD)?

MBD(Model based Design)是什么? 随着嵌入式行业的快速发展,MBD作为解决专家紧缺、国内解决方案匮乏的新软件开发方式备受关注。 MBD是一种通过建模自动生成代码的(Auto-generation Code)开发方式。 可以说它与如何用传统的C/C等计…

CANoe-仿真总线上的红蓝线、“CANoe DEMO“ license下的软件限制

1、仿真总线上的红蓝线 最近有人问我一个问题,就是Simulation Setup界面下的仿真网络里,有两条线:红线、蓝线。它们表示什么意思呢? 有人可能首先想到:会不会是代表CAN总线的两条物理连线? 那LIN网络呢?LIN网络属于单条线,它在仿真网络里应该显示一条线咯? LIN总线也…

ThreadLocal 详解

ThreadLocal 详解 1. ThreadLocal简介 1.1 官方介绍 /*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {code get} or {code set} method) has its own, indep…

【go语言http2.0代码实现】

go语言之http2.0Serverclient之前主要说的是基于http1.1的。然后因为http1.1存在的局限性,现在http2.0越来越流行,这里来根据go的源码来分析一下http2.0的实现。首先需要注意的是http2.0是在https的基础之上,因此推荐有https的基础或者看前面…

如何在Microsoft Teams中发布作业

之前我们介绍了在Microsoft Teams中收发批改作业的基础使用方法。今天我们会在“发布作业”这个方面上进行详细介绍。 首先我们进入Teams的“作业”点击“创建”。 选择“作业”。 可以通过“附加”的形式发布已创建的作业文件。 可以通过选择OneDrive的形式来选取里面的文件发…

BOSS直聘依然面临监管和估值过高的风险

来源:猛兽财经 作者:猛兽财经 BOSS直聘是中国重新开放和经济复苏的受益者 由于中国已经全面放开,所以,全球各地的分析师们正在上调对中国2023年经济增长的预测。 比如CNBC的文章就提到摩根士丹利(MS)的经…

Pandas 数据结构 - Series

前言Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。Series 由索引(index)和列组成,函数如下:pandas.Series( data, index, dtype, name, copy)参…

基于springboot,vue电影院售票系统

开发工具:IDEA服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7系统用户前台和管理后台两部分,项目采用前后端分离前端技术:vue elementUI服务端技术:springbootmybatis项目功…

Java 线程的几种状态及其切换的条件

1.线程状态及其含义2.状态之间切换的条件1.线程状态及其含义 NEW(初始化): 表示创建了Thread对象,但是还没有调用start (也就是系统内核还是没有创建对应的PCB) RUNNABLE(运行): 表示可运行的.线程创建后,调用了start方法,等待CPU的调度或者正在CPU中运行. BLOCKED(阻塞): 表…

【白皮书】PROFIBUS网络诊断

PROFIBUS标准已有30多年的历史,如今已是一种成熟的数字现场总线技术。PROFIBUS通常用于工厂和过程自动化行业,也可用于食品、饮料或制药等混合行业。此外,其还适用于楼宇自动化和轨道交通等领域。可见,PROFIBUS是一种可服务于这些…

华为OD机试 - 信号发射和接收

题目描述 有一个二维的天线矩阵,每根天线可以向其他天线发射信号,也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向的信号。 每根天线有自己的高度anth,每根天线的高度存储在一个二维数组中,各个天线…

第三方美颜sdk人脸识别的流程以及代码分析

小编曾经多次提到过人脸检测和人脸是被技术,那么这些算法在第三方美颜sdk中有用吗?答案是肯定的,不止有用,而且还非常重要。我们可以将人脸识别算法分为基础层算法与应用层算法,开头提到的人脸检测,实际上是…

Python程序设计-第1章Python程序基础

第1章Python程序基础一.预习笔记 1.1 Python简介: Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido Van Rossum于1989年发明。Python的第一个公开发行版于1991年发行。 1.2 Python开发环境搭建: python解释器的安装&#…

2017 hypernetworks 笔记

HYPERNETWORKS 这篇文章来自谷歌的一篇文章 Introduction 这篇文章中提出了一种方法:使用一个小网络(hypernetwork),小网络的作用是给一个larger network(main network)来生成权重,这个main ne…

结构型模式

1.代理模式 提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理结构 抽象主题类:通过接口或抽象类声明真实主题和代理对象实现的业务方法真实主题类:实现抽象主题中的具体业务&#xff0c…

小程序API

小程序APIapi介绍api类型示例小程序api-网络请求示例合法域名npm基础应用核心步骤npm下载vant-weapp组件库核心步骤api介绍 小程序开发中,会使用到很多内置的功能,这些功能都被封装到小程序的api中了。比如 弹出提示框发送网络请求等上传文件、下载文件…

centos的官网下载和vm16虚拟机安装centos8【保姆级教程图解】

centos8的官网下载和vm16虚拟机安装centos8【保姆级图解】centos下载vm虚拟机安装centos可能出现的问题vcpu-0centos下载 centos官网:https://www.centos.org/ 进入官网后,点击Download 选择 Centos Stream 8 x86_64,并且点击进入 然后会出现国内的…

穿越寒冬 向新而行 | 智和信通2022年度年终总结大会圆满落幕

岁序更迭,新程再启,2022年在挑战与成就中谢幕。日迈月征,朝暮轮转,2023年在希望中启航。2023年1月13日,北京智和信通技术有限公司(以下简称“智和信通”)召开2022年度年终总结大会。会议全面总结…

Tp5 通过crontab 执行定时任务

声明:此处为ThInkCmf 为例:在主题中的command 中新建php文件如图在PHP文件中设置脚本名称及注释,并编写业务逻辑。protected $output ;/*** 作者:执着* 说明:定义脚本名称及添加注释* param setName:定义脚本名称* pa…

【Python百日进阶-数据分析】Day227 - plotly的子图

文章目录一、Plotly 图形工厂子图1.1 垂直图形工厂图表1.2 水平表格和图表1.3 垂直表格和图表二、表格和图表子图三、地理子图四、混合子图和 Plotly Express一、Plotly 图形工厂子图 Plotly 的 Python API 包含一个图形工厂模块,其中包含许多包装函数,…