【C++】STL简介

在这里插入图片描述

🔥个人主页: Forcible Bug Maker
🔥专栏: C++

目录

  • 前言
  • 什么是STL?
  • STL的历史
  • STL的版本
  • STL六大组件
  • STL的优缺点
    • STL的优点:
    • STL的缺点:
  • 如何学习STL
  • 结语

前言

本篇博客主要内容:STL简介

开始学习STL之前,是不是得先知道STL是个什么东西,以及如何学习STL呢?话不多说,开始我们今天的内容!

什么是STL?

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

STL的历史

STL(Standard Template Library,标准模板库)的起源可以追溯到C++语言的早期发展阶段。STL的设计和创建主要归功于Alexander Stepanov,他在1980年代开始研究泛型编程和数据结构

Alexander Stepanov最初在惠普公司(HP)工作期间,对泛型编程和算法进行了深入研究。他意识到,在C++中,由于缺乏标准的数据结构和算法库,程序员经常需要重复编写相同的代码,这导致了代码的冗余和低效。为了解决这个问题,Stepanov开始设计一种基于模板的库,该库能够提供通用、高效的数据结构和算法,同时保持灵活性和可扩展性

1994年,Stepanov首次公开发表了STL的概念和设计。 STL最初是基于Silicon Graphics(SGI)的STL版本开发的,这个版本被称为SGI-STL。SGI-STL的发布引起了广泛的关注,并被许多厂商和开源社区所采用和扩展

随着STL的发展,越来越多的开发者开始意识到它的价值,并加入到STL的开发和贡献中。在1995年,C++标准委员会推荐将STL作为C++标准库的一部分,这标志着STL正式成为了C++语言的一部分

1998年,C++标准库正式发布,STL被正式纳入其中。 此后,STL随着C++标准的不断发展而不断完善和扩展。在C++11、C++14、C++17等后续标准中,STL引入了更多的新特性和数据结构,如unordered_map、unordered_set、array等,进一步提高了STL的实用性和效率

STL的创建和发展是一个由多位专家和开发者共同努力的过程。它不仅是C++标准库的重要组成部分,也是C++编程中不可或缺的工具之一。

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

目前主流的两个版本,一个是微软的P.J.版本,至今一直由微软的工程师开发维护中;另一个就是被GCC(Libux)采用的SGI版本。只有不断迭代和优化的版本,才能始终在大众的视野中,并被广泛的使用和传播。

STL六大组件

  1. 容器(Containers)
    容器是STL中用于存储和管理数据的组件。它们提供了各种数据结构,如向量(vector)、列表(list)、双端队列(deque)、集合(set)、映射(map)等。
    这些容器封装了数据的存储方式,并提供了一系列成员函数来访问和操作数据。
  2. 迭代器(Iterators)
    迭代器是STL中用于遍历容器元素的工具。它们提供了一种通用的方式来访问容器中的元素,而无需关心容器底层的实现细节。
    STL中的迭代器分为五种类型:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。不同类型的迭代器提供了不同的操作功能。
  3. 算法(Algorithms)
    STL中的算法库提供了一系列常见的数据处理算法,如排序(sort)、查找(find)、遍历(traverse)、修改(modify)、复制(copy)、合并(merge)、反转(reverse)、旋转(rotate)等。这些算法可以与STL容器一起使用,以实现各种复杂的数据处理任务。
  4. 仿函数(Functors)
    仿函数也称为函数对象,是一种特殊的类,其行为类似于函数。它们通过重载函数调用运算符operator()来定义自己的行为。
    仿函数可以作为算法的某种策略,用于定制算法的行为。STL中的许多算法都接受仿函数作为参数,以实现更灵活的数据处理。
  5. 配接器(Adapters)
    配接器是一种将容器或仿函数转换成其他类型或接口的工具。它们提供了一种将现有组件组合起来以创建新组件的方法。
    STL中的配接器包括容器配接器(如栈stack、队列queue和优先级队列priority_queue)和迭代配接器(如反向迭代器)。这些配接器可以扩展STL组件的功能和用途。
  6. 分配器(Allocators)
    分配器用于管理容器所使用的内存。它们提供了内存分配、回收和管理的方法,以实现高效的内存使用。
    STL中的分配器是一个可配置的组件,可以根据需要选择不同的分配策略。这有助于优化程序的性能和内存使用。

在这里插入图片描述

C++ STL的六大组件为程序员提供了强大的工具集,可以高效地实现各种复杂的数据结构和算法。这些组件的灵活性和可复用性使得C++成为了一种高效、可靠且易于维护的编程语言。

STL的优缺点

STL作为C++标准库的一个重要组成部分,提供了大量通用的数据结构、算法和函数对象,极大地提高了C++编程的效率和可重用性。然而,STL也有其优点和缺点。

STL的优点:

  • 高效性:STL中的数据结构和算法经过精心设计和优化,能够在各种场景下提供高效的性能。例如,vector、list、map等容器都采用了高效的内存管理策略,而sort、find等算法也使用了优化的算法实现。

  • 通用性:STL使用了模板技术,支持泛型编程,因此可以处理各种类型的数据,而不仅仅是内置类型。这使得STL的代码具有高度的可重用性。

  • 易用性:STL提供了简洁、一致的接口,使得使用STL的代码更加清晰、易读。同时,STL也遵循了C++的标准库规范,使得学习STL变得更加容易。

  • 可扩展性:STL允许用户自定义数据类型和算法,通过适配器(adapters)和仿函数(functors)等技术,可以轻松地将自定义的数据类型和算法与STL库中的组件集成起来。

  • 安全性:STL库中的许多容器和算法都提供了对异常和错误的处理机制,例如,在容器越界访问时抛出异常等。这有助于减少程序中的错误和安全隐患。

STL的缺点:

  • 性能开销:虽然STL中的许多数据结构和算法都经过了优化,但在某些情况下,使用STL可能会导致一些额外的性能开销。例如,STL中的动态内存分配和释放可能会比使用静态内存或堆外内存更加耗时。

  • 学习曲线:STL的接口和用法相对复杂,需要一定的学习和实践才能熟练掌握。特别是对于初学者来说,学习STL可能会比较困难。

  • 内存管理:虽然STL提供了许多方便的容器和算法,但它们在内存管理方面仍然存在一些限制。例如,STL中的容器通常不会自动回收不再使用的内存,这可能会导致内存泄漏问题。此外,STL中的动态内存分配也可能会导致内存碎片问题。

  • 非标准扩展:虽然STL是C++标准库的一部分,但不同的编译器和平台可能会提供不同的STL实现和扩展。这可能会导致跨平台兼容性问题和代码移植问题。

总结一下:STL确实提供了高效、通用、易用、可扩展和安全的数据结构和算法,极大提升了C++编程的效率和可重用性;但在某些情况下可能引入性能开销,具有陡峭的学习曲线,内存管理需要谨慎处理,存在非标准扩展可能导致的兼容性问题。STL是把双刃剑,当你在正真了解STL之后,才能真正体会到这句话的含义。

如何学习STL

STL是打各种算法比赛以及开发过程中必不可少得一个工具,学习STL可以分为四步,首先是了解其底层得数据结构,其次学习其用法,然后尝试深入理解其底层实现,最后需要通过大量习题和项目的练习加强理解。
在这几个阶段的过程中,你可以参考官方文档以及各种书籍,比如:C++官方文档:https://zh.cppreference.com,不过这个网站网速较慢,而且内容比较杂乱;这里推荐参考这个网站,https://cplusplus.com,它虽然不是官网,但是里面的C++STL的内容整理的非常清晰,唯一的缺点就是全英文。在学习和实践STL源码的过程中,可以参考侯捷老师的源码剖析:
在这里插入图片描述
刷题的话,各大刷题网站都会有对应的题目,博主其实也有出一些相关练习及题解的想法。
力扣
codeforces
洛谷

结语

本篇博客主要介绍了有关STL的历史,主流版本,六大组件,以及其优缺点和学习方法等内容。希望能帮助到大家。博主后续会持续更新更多有关于STL的内容,感谢大家的支持!♥

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

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

相关文章

240503-关于Unity的二三事

240503-关于Unity的二三事 1 常用快捷键 快捷键描述CtrlP播放/停止Ctrl1打开Scene窗口Ctrl2打开Game窗口Ctrl3打开Inspect窗口Ctrl4打开Hierarchy窗口Ctrl5打开Project窗口Ctrl6打开Animation窗口 2 关联VisualStudio2022 3 节约时间:将最新声明的参数移动到最上…

解决wget报错:ERROR 403: Forbidden.

原因: 服务器正在检查引用者,部分 HTTP 请求会得到错误响应。不以 Mozilla 开头或不包含 Wget 的用户代理的请求会被拒绝。 解决方案: wget --user-agent“Mozilla” 要下载的链接 如: wget --user-agent"Mozilla" …

jvm垃圾回收机制介绍

JVM(Java虚拟机)是Java程序的运行环境,它负责执行字节码文件。JVM的工作原理主要包括以下几个部分:类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码,执行引擎负…

java入门-日期类

日期类 Date类 Date类表示特定的时间&#xff0c;可以精确到毫秒。 获取Date对象 Date date new Date(); 构造方法 /*** Allocates a <code>Date</code> object and initializes it so that* it represents the time at which it was allocated, measured to…

k8s笔记 | Ingress

安装Ingress 添加helm创库 Installation Guide - Ingress-Nginx Controller Ingress | Kubernetes 下载包 将 文件helm 放到 /usr/local/bin/ 并给到执行权限 # 添加可执行权限 chmod ux helm # 测试是否能运行 helm version# 结果 version.BuildInfo{Version:"v3.14…

详细分析Java中的敏感词过滤(附Demo)

目录 前言1. 简易Demo2. 进阶Demo 前言 敏感词直接过滤&#xff0c;有效防止敏感信息的上传 本文主要给一个启发的思路 1. 简易Demo 通过简易的Demo机制了解基本原理 import java.util.HashSet; import java.util.Set;public class test {private Set<String> sensi…

基于STM32的最小系统电路设计(STM32F103C8T6为例)

前言&#xff1a;本篇博客为嵌入式硬件领域的文章&#xff0c;对 STM32 的最小系统电路设计进行教学。本篇博客以嘉立创 EDA&#xff08;标准版&#xff09;进行绘制 STM32F103C8T6 的最小系统电路 PCB 板&#xff0c;STM32 的最小系统通常包括&#xff1a;微控制器、时钟电路、…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

ESP-01/01S 烧录固件

目录 一、ESP-01 与 ESP-01S 的区别二、ESP-01 与 ESP-01S 烧录 AT 固件1、模块接线a、管脚功能定义b、模组启动模式c、模块接线 2、下载 AT 固件3、下载固件烧录工具4、固件烧录步骤5、模块快速烧录 AT 固件 三、ESP-01 与 ESP-01S 发送 AT 指令1、模块接线2、上电信息3、发送…

硅片和SOI哪个研究方向更好?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我研一将要结束&#xff0c;即将进入课题组。我们课题组方向有硅片和soi两种方向&#xff0c;这两种方向该如何选择呢&#xff1f; 硅片与…

Linux的Shell脚本详解

本文目录 一、什么是 Shell 脚本文件 &#xff1f;二、编写Shell脚本1. 基本规则2. shell 变量&#xff08;1&#xff09;创建变量&#xff08;2&#xff09;引用变量&#xff08;3&#xff09;删除变量&#xff08;4&#xff09;从键盘读取变量&#xff08;5&#xff09;特殊变…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权&#xff01;&#xff01;&#xff01; Vulnhub靶机&#xff1a;DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …

【linux】初步认识文件系统

初步认识文件系统 前置知识的简单了解简单回顾C语言的文件操作stdin&stdout&stderr 系统文件IOopen函数的返回值文件描述符fd打开文件背后的操作文件描述符的分配规则 前置知识的简单了解 文件包括了文件内容和文件属性两个部分(文件内容顾名思义就是文件里面的数据等…

tomcat启动闪退问题解决方法

文章目录 Tomcat启动闪退的常见问题及解决方法Tomcat是什么启动闪退的常见问题及解决方法1. 内存不足问题描述&#xff1a;案例分析&#xff1a;解决方法&#xff1a; 2. 端口冲突问题描述&#xff1a;解决方法&#xff1a; 3. 日志错误问题描述&#xff1a;解决方法&#xff1…

冰蓄冷系统基础知识

冰蓄冷是将水制成冰储存冷量&#xff0c;它是潜热蓄冷的一种方式。当压力保持不变时&#xff0c;物质在相变过程中保持恒定温度并吸收或释放热量&#xff0c;通常把这个温度称为相变温度(即溶解温度或凝固温度)&#xff0c;把吸收或释放的热量称相变潜热。在常压下&#xff0c;…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续使用 4、创建时间序列数据 5、划分数据集 6、定义LSTM网络 &#xff08;1&#xff09;创建顺序模…

一、初识VUE

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c…

MySQL常见问题解决和自动化安装脚本

常见问题 MySQL密码正确但无法登录的情况 这种情况一般都是因为缓存&#xff0c;使用mysql -u root -p123456直到成功登陆为止&#xff0c;并且进入之后重新修改密码&#xff0c;多次重复修改密码的命令并且再一次清除缓存后退出。 ALTER USER rootlocalhost IDENTIFIED WIT…

基于Unity+Vue通信交互的WebGL项目实践

unity-webgl 是无法直接向vue项目进行通信的&#xff0c;需要一个中间者 jslib 文件 jslib当作中间者&#xff0c;unity与它通信&#xff0c;前端也与它通信&#xff0c;在此基础上三者之间进行了通信对接 看过很多例子&#xff1a;介绍的都不是很详细&#xff0c;不如自己写&…

【MATLAB源码-第199期】基于MATLAB的深度学习(CNN)数字、模拟调制识别仿真,输出识别率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于深度学习的调制识别系统利用复杂的数学模型和算法来识别和分类从不同来源接收到的无线信号的调制类型。这种技术的应用广泛&#xff0c;特别是在无线通信、电子战、频谱监测和认知无线电等领域中具有重要价值。调制识别系…