21天学会C++:Day15----STL简介

news2025/1/14 0:57:39

· CSDN的uu们,大家好。这里是C++入门的第十五讲。
· 座右铭:前路坎坷,披荆斩棘,扶摇直上。
· 博客主页: @姬如祎
· 收录专栏:C++专题

 

目录

1. 什么是STL

2. STL的版本

3.STL的六大组件

4. STL的重要性

5. 如何学好STL

STL的缺陷


1. 什么是STL

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

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

3.STL的六大组件

STL可以分为六大组件,它们分别是:容器(Containers)、算法(Algorithms)、迭代器(Iterators)、函数对象(仿函数)(Function Objects)、适配器(Adapters)和分配器(Allocators)。下面我将详细介绍每个组件。

1. 容器(Containers):
   - 容器是STL的核心,提供了多种数据结构,包括向量(vector)、链表(list)、双端队列(deque)、栈(stack)、队列(queue)、优先队列(priority_queue)、集合(set)、映射(map)、多重映射(multimap)、多重集合(multiset)等。每种容器都有自己的特点和适用场景,可以方便地存储和操作数据。

2. 算法(Algorithms):
   - STL包含了大量通用算法,如排序、查找、遍历等,这些算法可以用于不同类型的容器。这使得开发者可以快速有效地操作和处理容器中的数据,无需自己实现这些常见的操作。

3. 迭代器(Iterators):
   - 迭代器是STL中的一个关键概念,它允许开发者在容器中遍历数据,而不必关心底层数据结构的具体细节。STL提供了多种类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,以支持不同的遍历需求。

4. 函数对象(Function Objects):
   - 函数对象(或仿函数)是可调用对象,它们可以像函数一样被调用,通常用于STL算法中的自定义操作。STL提供了一些内置的函数对象,如比较函数对象和数学函数对象,同时也允许开发者定义自己的函数对象。

5. 适配器(Adapters):
   - 适配器是用于将一个容器或迭代器转化成另一种容器或迭代器的工具。STL提供了很多适配器,如栈适配器、队列适配器、优先队列适配器等,它们基于已有的容器提供不同的接口和行为。

6. 分配器(Allocators):
   - 分配器是用于控制内存分配和释放的组件,可以自定义内存管理策略。STL中的容器通常使用默认分配器,但你也可以使用自定义的分配器来满足特定需求,如内存池分配器。

STL的这六大组件共同构成了一个强大的编程工具集,使C++开发者能够更高效地进行数据处理和算法实现。这些组件的设计目标是提供通用性、可重用性和性能,从而使开发更为便捷。通过熟练掌握STL,你可以加速C++应用程序的开发并提高代码的可维护性。

4. STL的重要性

C++标准模板库(STL)在C++编程中具有重要的地位,其重要性体现在以下几个方面:

1. 提高开发效率:STL提供了丰富的容器、算法和工具,这些工具大大减轻了开发者的工作负担。通过使用STL,开发者能够快速地实现各种数据结构和算法,而无需自行编写复杂的数据结构和算法代码。这节省了时间和精力,使开发过程更加高效。

2. 提高代码可维护性:STL的组件经过广泛测试和优化,它们具有高质量的实现,可以减少代码中的错误和漏洞。此外,STL的通用性和标准化接口使得代码更易于理解和维护,因为其他开发者也能够轻松理解和使用STL的组件。

3. 提高代码性能:STL的组件通常经过高度优化,可以提供高性能的数据结构和算法。在很多情况下,STL提供的实现比手工编写的实现更快更稳定,因为STL的实现考虑了各种底层细节和性能优化。

4. 跨平台和标准化:STL是C++标准的一部分,因此可以在各种C++编译器和平台上使用,而不需要担心不同编译器的差异。这种跨平台性使得STL成为一种可移植的解决方案。

5. 丰富的数据结构和算法:STL提供了多种容器和算法,涵盖了广泛的应用场景,从简单的数组到复杂的图算法。这使得开发者能够更轻松地解决各种编程问题,而不必从零开始编写特定数据结构或算法。

6. 高度扩展性:STL的组件可以与自定义数据结构和算法结合使用。开发者可以通过实现自定义容器、迭代器、函数对象和分配器来扩展STL,以满足特定需求。

5. 如何学好STL

您大可放心,这个交给我就好啦,接下来的部分,我首先会告诉您怎么使用这些STL容器,然后以较为简单的方式模拟实现。通过模拟实现的过程你将对C++的STL有更深层次的理解!

推荐书籍:《STL远吗剖析》

STL的缺陷

1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出 来已经相隔了13年,STL才进一步更新。

2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。 3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。

4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语 法本身导致的。

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

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

相关文章

二叉树实现表达式求值(C++)

用二叉树来表示表达式,树的每一个节点包括一个运算符和运算数。代数表达式中只包含,-,*,/,(,)和一位整数且没有错误。按照先括号,再乘除,后加减的规则构造二叉…

【算法设计zxd】第6章 回溯法

目录 6.1 回溯法的设计技术 : 四皇后问题 回溯法: 算法框架: 思考题: 回溯算法的适用条件 【例6-1】求满足下列不等式的所有整数解: 6.2回溯算法的经典例题 【例6-2】装载问题  问题分析 计算模型  算法设计与描…

selenium多窗口、多iframe切换、alert、3种等待

1、多标签/多窗口之间的切换 场景: 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口上进行操作。这种情况下,需要识别多标签或窗口的情况。 操作方法: switch_to.window()方法:切换…

【AFL学习笔记(一)】简单的使用AFL进行漏洞挖掘测试

首先声明一点,ALF都是在Linux系统上运行 本文使用的是Ubuntu 20.4 版本进行演示 Step 1 下载afl-2.52b 官网地址afl2.52b 直接下载地址直接下载地址 下载完成之后在Ubuntu系统上进行解压: tar -afl-2.52b.tgzStep 2 创建测试用例 ①:创…

YOLOv5-训练自己的VOC格式数据集(VOC、自建数据集)

YOLOv5:训练自己的 VOC 格式数据集 1. 自定义数据集 1.1 环境安装 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple注意: 安装 lxmlPillow 版本要低于 10.0.0,解释链接: module ‘PIL.Image’ has no attri…

Amazon图片下载器:利用Scrapy库完成图像下载任务

概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…

vue 使用crypto.js解密后,用JSON.parse转义报错非空白格解决办法

问题: 用JSON.parse转义crypto解密后的json字符串会发生错误。如图: 原因: 那是因为crypto自己加了一些未可见的字符,所以用正常的JSON.parse(xxxx)会报错。 解决办法: JSON.parse(xxxx.replace(/[\u0000-\u001F\u…

TX Text Control.NET 32.0 For WPF

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件,它在专为 Visual Stu…

C++入门篇---(完)内联函数,auto,for,nullptr

往期回顾: ⭐C入门篇---(1)命名空间与缺省参数 ⭐C入门篇---(2)函数重载 ⭐C入门篇---(3)引用 目录 1.内联函数 1.1概念 1.2特性 2.aotu关键字 2.1类型别名 2.2auto简介 2.3auto使用细节 2.4auto不能推导的场景 3.范围for 3.1语法 3.2使用条件 4.指针空值(nullptr) …

C#中List、Dictionary、HashSet用法以及区别

前言 在C#编程中,List、Dictionary和HashSet是常用的集合类型,它们都有自己的特点和适用场景。本篇博客将介绍它们的用法、区别及常见操作。深入了解这些集合类型,能够帮助我们更好地组织和处理数据。 1. List: List是一个有序可重复集合,可…

【AI视野·今日CV 计算机视觉论文速览 第269期】Tue, 17 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Tue, 17 Oct 2023 Totally 158 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers HairCLIPv2: Unifying Hair Editing via Proxy Feature Blending Authors Tianyi Wei, Dongdong Chen, Wenbo Zhou, Jing …

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

![请 https://cloud.tencent.com/act/cps/redirect?redirect2446&cps_key2e531299bf7e92946df4c3162a81b552&fromconsole

【故障诊断】用于轴承故障诊断的候选故障频率优化克改进包络频谱研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

网络编程 - TCP协议

一,TCP基本概念 TCP的特性: TCP是有连接的:TCP想要通信,就需要先建立连接,之后才能通信 TCP是可靠传输:网络上进行通信,A给B发消息,这个消息是不可能做到100%送达的,所以…

Qt配置OpenCV(保姆级教程)

Qt配置OpenCV Qt下载CMake安装OpenCV安装Qt配置OpenCV Qt下载 Qt点击下载 具体的安装过程就不在讲了,根据自己的需求进行安装。 CMake安装 CMake点击下载 直接跟着提示进行安装就行。 OpenCV安装 OpenCV点击下载 提示:这里建议安装我指定的版本&#x…

关于python环境下的语音转文本,whisper或funASR

因为前阵子,有需求要将语音转为文本再进行下一步操作。感觉这个技术也不算是什么新需求,但是一搜,都是大厂的api,或者是什么什么软件,由于想要免费的,同时也要嵌入在代码中,所以这些都不能用。、…

半导体可靠性测试方法都有哪些?

半导体测试是半导体设备中的一种技术,其中半导体组件(芯片、模块等)在组装到系统就会出现故障。在特定电路的监控下,部件被迫经历一定的半导体试验条件,并分析部件的负载能力等性能。这种半导体测试有助于确保系统中使用的组件导体器件&#…

JDK命令行工具

1 jps: jps命令可以方便的查看进程id,启动类,传入参数, jvm参数 jps命令类似于linux 下的ps,但是只列出java的进程. 直接运行jps不加参数,会列出java程序的进场ID,及main函数名称 C:\Users\shj>jps 42340 Jps 41064 42040 JucApplication 37804 Launcher可以看到,目前有4个…

Confluence 用户管理

1. 创建用户 功能入口: Confluence→管理→用户管理→添加用户 功能说明: 填写必要信息,点击“添加”按钮,即可完成用户创建 用户名:英文名称,真实用户统一采用邮箱前缀;全名:中…

python换源,解决pip安装第三方库时无法下载和连接超时等问题

使用pip安装包是用python编码最基础并且必不可少的基础,新手入门时常常会跟着网上的教程说换源,但还会出现意料之外的问题,比如: 1.换源之后还是连接超时 2.在pycharm的python interpreter中安装包显示 Error updating package …