C++的Odyssey之旅——STL

news2024/11/24 6:20:55

W...Y的主页 😊

代码仓库分享💕 


🍔前言:我们已经将基本语法了解的差不多了,现在我们就该进入C++中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这些结构的创建,当我们学习后STL就再也不用考虑这些问题了,下面让我们一起走入STL的世界。

目录

 什么是STL

STL的版本

STL的六大组件

STL的重要性 

如何学习STL

STL的缺陷与不足 


 什么是STL

STL(Standard Template Library)是C++的一个重要组成部分,它提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。STL的设计目标是提供一种通用、高效、可复用的方法来处理数据结构和算法,使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要阅读部分源代码,主要参考的就是这个版本。

STL的六大组件

C++的STL(Standard Template Library)包括六大组件,每个组件都有其特定的用途。这些组件在C++编程中提供了强大的工具,以便更轻松地操作数据结构和执行算法。以下是STL的六大组件及其用途:

  1. 容器(Containers)

    用途:容器是用于存储和管理数据的对象。STL提供了多种容器,包括向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。每种容器都有其独特的特性,可以选择最适合特定任务的容器。
  2. 迭代器(Iterators)

    用途:迭代器是用于遍历容器中的元素的抽象概念。它们提供了一种通用的方式来访问容器中的元素,无论容器的类型如何。迭代器使算法能够在不同容器上工作,而不需要知道容器的具体实现细节。
  3. 算法(Algorithms)

    用途:STL提供了大量的通用算法,如排序、查找、遍历、变换等。这些算法可以应用于各种容器,使你能够在数据上执行各种操作,而无需重新实现算法。这提高了代码的重用性和可维护性。
  4. 函数对象(Function Objects)

    用途:函数对象是可调用的对象,类似于函数指针。它们通常用于在算法中执行特定的操作。STL提供了一些内置的函数对象,同时你也可以定义自己的函数对象,以满足特定的需求。
  5. 适配器(Adapters)

    用途:适配器是用于调整容器或迭代器的接口以满足特定需求的工具。STL提供了适配器,如栈适配器(stack)、队列适配器(queue)、优先队列适配器(priority_queue)等,以及迭代器适配器,如反向迭代器(reverse_iterator)、插入迭代器(insert_iterator)等。
  6. 分配器(Allocators)

    用途:分配器用于管理内存分配和释放,以便更灵活地控制容器的内部内存管理。分配器允许你自定义内存分配策略,以适应不同的应用需求。

这些六大组件一起构成了STL,为C++程序员提供了一种强大的工具集,以处理各种数据结构和执行各种算法。使用STL可以大大提高代码的可维护性、可读性和重用性,同时提供高性能的实现。根据具体的编程需求,你可以选择适当的容器、算法和其他STL组件来解决问题。

STL的重要性 

STL(Standard Template Library)在C++编程中具有重要的作用,无论是在学术、工业界还是个人项目中,其重要性体现在多个方面:

  1. 提高开发效率:STL提供了各种通用的数据结构(如向量、链表、集合、映射等)和算法(排序、搜索、遍历等)。通过这些现成的组件,开发人员无需从头实现这些基本结构和操作,从而节省了大量的时间和精力。

  2. 代码重用:STL的组件都是经过广泛测试和优化的。通过重复使用这些经过验证的组件,开发者可以确保其代码质量和稳定性。

  3. 提高代码可维护性:STL组件经过优化和标准化设计,使得代码更易于阅读和维护。使用标准的接口和数据结构使代码更易于理解,并且降低了出错的可能性。

  4. 性能优势:STL经过优化和精心设计,提供了高效的数据结构和算法实现。这些实现经过了广泛的测试和调优,因此在大多数情况下能提供高性能的操作。

  5. 学术和教育用途:在教学中,STL作为C++的重要组成部分,为学生提供了一种标准化的方式来学习数据结构和算法。这种标准化使得学生能够更轻松地理解和应用这些概念。

  6. 可移植性:STL提供了一种标准化的方法来处理数据结构和算法,使得开发的代码更具可移植性。在不同的平台和编译器上,STL的行为保持一致,从而使代码更易于在不同环境中移植和使用。

  7. 结合现代编程范式:STL与现代的C++编程范式相结合,如泛型编程、模板元编程等,使得在不同层次上处理问题更为方便和高效。

STL在我们的生活中包括在笔试、面试和工作中,也有着举足轻重的作用:

  1. 笔试

    • 在编程竞赛中,STL提供了许多现成的数据结构和算法,能够加速解决问题的速度。对STL的熟练掌握可以让你更快地编写正确的代码,因此在竞赛中具有明显的优势。
    • 许多竞赛平台支持C++语言,并提供了STL的标准库,因此熟练使用STL可以帮助你更轻松地完成竞赛任务。
  2. 面试

    • 在技术面试中,STL通常是C++面试中的一个关键主题。面试官可能会要求你解释STL容器和算法的使用,要求你编写特定问题的STL解决方案,或要求你评估STL容器和算法的性能。
    • 熟练掌握STL可以让你在面试中更自信地回答问题,显示你对C++语言和基本数据结构的了解。
  3. 工作中

    • 在实际工作中,STL在C++开发中经常用于构建高性能的应用程序。它提供了各种数据结构,如向量、列表、映射等,以及众多算法,如排序、搜索、迭代等,可以在开发中广泛使用。
    • 使用STL可以提高开发效率,减少开发时间,因为你可以重用现成的、经过优化的数据结构和算法。这可以节省时间和开发成本。
    • STL还有助于编写更稳健的代码,因为它经过了广泛的测试和优化,减少了潜在的错误。

总之,STL在笔试、面试和工作中都具有重要性,因为它是C++编程的核心组成部分,对于解决问题、提高效率和构建稳健的应用程序都非常有帮助。熟练掌握STL是C++开发者的一个重要技能,无论是应对竞赛任务、通过技术面试还是在实际工作中取得成功。

如何学习STL

学习STL是C++编程的重要一部分,它提供了一系列通用数据结构和算法,可以用于解决各种问题。以下是一些学习STL的步骤和建议:

1.掌握C++基础:
在学习STL之前,确保你已经熟练掌握了C++的基础知识,包括面向对象编程、数据类型、循环、条件语句等。STL是C++的一部分,因此对C++的理解至关重要。
2.阅读STL文档:
在C++官方文档或其他可靠的资源中查看STL的文档。了解STL的组成部分,包括容器(containers)如向量、列表、映射等,以及算法(algorithms)如排序、搜索、迭代等。
3.书籍和在线教程:
寻找C++ STL的相关书籍和在线教程,这些资源通常会深入讲解STL的使用和内部工作原理。一些经典书籍包括《STL源码剖析》(Inside the C++ Object Model)、《Effective STL》等。
4.编写示例代码:
最好的学习方法之一是编写示例代码。创建小型项目或编写小程序来练习使用不同的STL容器和算法。这将帮助你理解它们的用途和如何操作。
5.深入研究容器和算法:
逐一学习STL容器,了解它们的特性、适用场景和使用方法。同样,学习STL算法,包括排序、搜索、转换等。了解每个容器和算法的时间复杂度和性能特点也很重要。
6.解决问题:
尝试解决各种问题和挑战,使用STL来实现解决方案。这有助于你将STL的知识应用到实际问题中。
7.学习STL源代码:
如果你有足够的兴趣和时间,可以尝试研究STL的源代码。这将帮助你更深入地理解STL的实现方式,但可能需要一定的C++和数据结构知识。
8.参与在线社区和讨论:
加入C++编程社区,如Stack Overflow、GitHub等,与其他开发者交流和讨论STL相关的问题。这样可以学到更多实际经验和最佳实践。
9.练习和项目:
最重要的是实践。尝试在实际项目中使用STL来解决问题,或者自己构建小型项目,以加强你的技能。
10.持之以恒:
学习STL可能需要一些时间,因此要保持耐心和坚持。不断练习和挑战自己,逐渐提高你的STL技能。

总结一下:学习STL的三个境界:能用,明理,能扩展 。 

STL的缺陷与不足 

 1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出
来已经相隔了13年,STL才进一步更新。
2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的。

5.可读性太差使用STL时,特别是在处理复杂的模板和元编程时,代码可能变得难以阅读和理解。模板代码通常比传统的代码更难以推断和理解。

6.不支持某些数据结构:STL并不支持某些特定的数据结构,例如树状结构(例如红黑树)。虽然STL提供了一些通用的容器,但有时你可能需要自行实现特定类型的数据结构。

尽管存在这些缺陷和不足,STL仍然是一个强大和广泛使用的工具。它为C++开发者提供了许多方便、可重用的数据结构和算法,极大地简化了程序的开发过程。针对特定的需求,有时开发者可能需要结合STL的优点,自行编写或使用其他专门优化过的库来弥补STL的不足。 

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

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

相关文章

pyinstaller 错误排查的验证史

在pyinstaller打包时出现如下错误,很明显感觉是路径被转义 或者历史迁移导致的 报错路径:OSError: [WinError 123] 文件名、目录名或卷标语法不正确。: D:\t_job\x07naconda3_20201121\\Lib\\site-packages 安装路径:File "D:\11_job\…

这些机器视觉工程师犯法了,竟然在闲鱼或淘宝上卖公司的机器视觉程序架构源码

目录 ​从个人层面来讲:从公司层面来讲: ​从个人层面来讲: 个人是法盲,法律意识淡薄只是一方面,另外一个方面就是对于代码的所有权,以及代码的安全性重视不够。把机器视觉程序架构源码打包在闲鱼或淘宝上…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…

制作一个模板

创建模拟对象是一种有用的技术,它允许您专注于应用程序的一部分,而不必担心系统中尚未存在的其他部分。我想设计应用程序的主页,我不想因为没有用户系统而分心,所以我只创建了一个用户对象,这样我就可以继续了。 应用…

【紫光同创国产FPGA教程】【PGC1/2KG第七章】7.数字钟实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC…

工厂设备扫码使用售卖联网开发需要怎么开发开源代码?

我们将详细介绍如何使用开源代码开发一套用于工厂设备联网统计的系统。我们将详细讨论所需硬件组件的选择、开源框架和库的使用、软件开发流程以及最后的集成和部署。在这个过程中,我们将提供实用的操作步骤和指导,帮助你更容易地完成这个复杂的任务。 …

leaflet:利用Leaflet-Geoman绘制多种图形,导出为geojson文件(135)

第135个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中利用Leaflet-Geoman绘制多种图形,导出为geojson文件。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。利用FileSaver可以导出geojson文件。 直接复制下面的 vue+leaflet源代码,操作2分钟…

C语言求解一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

完整代码&#xff1a; /* 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问 该数是多少&#xff1f;*/ #include<stdio.h>int main(){//num为最终所求那个数int num;//i*i为第一个完全平方数for (int i 10; …

实验5-1——本地yum源的配置

本地yum源的配置 实验步骤&#xff1a; 1.挂载磁盘(可以看这篇博客&#xff1a;磁盘的挂载和卸载&#xff09; &#xff08;1&#xff09;创建挂载点 mkdir /mnt/cdrom &#xff08;2&#xff09;挂载磁盘 mount /dev/sr0 /mnt/cdrom #或者 mount /dev/cdrom /mnt/cdrom …

嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能

一百二十一、基于QT的OpenCV库实现人脸识别功能 121.1 UI 界面 登录按钮现在没啥实际作用&#xff0c;因为没加功能&#xff0c;可以添加在识别成功后运行的功能代码 121.2 思路 显示人脸&#xff1a; 通过 VideoCapture 这个类下面的 open() 方法打开摄像头&#xff0c;对…

算法进阶指南图论 最优贸易

最优贸易 题目描述 C C C 国有 n n n 个大城市和 m m m 条道路&#xff0c;每条道路连接这 n n n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m m m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的…

大语言模型比武

今年随着 ChatGPT 的流行&#xff0c;并在各个领域有一定程度生产级别的应用。国内外也掀起了一股大语言模型浪潮&#xff0c;各大厂商都推出了自己的大语言模型&#xff0c;阿里推出了 通义千问&#xff0c;腾讯推出了 Hunyuan&#xff0c;亚马逊云推出了 Titan&#xff0c;大…

Ubuntu22.04安装MySql

在Ubuntu上安装mysql就比较简单了 1、常规操作&#xff0c;更新软件包列表 apt update 至少安装之前看一眼版本吧 apt list mysql-server 嗯&#xff0c;是8.0.35版本的 2、安装mysql apt install mysql-server 3、给root用户设置密码 # 第一次安装完无需密码,让你输入…

MathType2024优秀的数学公式编辑工具

数学是许多学科中必不可少的一部分&#xff0c;而数学公式在学术和科学领域使用广泛。然而&#xff0c;许多人在创建和编辑数学公式时面临困难。 作为软件开发人员&#xff0c;在编写技术文档时通常也会需要输入一些复杂数学、物理公式&#xff0c;而 Word 中的公式编辑有时使…

PCL ICP点云精配准(点到面)

文章目录 一、简介二、PCL中的类型三、实现代码四、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,当然这需要…

【PHP】医院HIS手术麻醉临床信息管理系统源码 实现术前、术中、术后全流程管理

手术麻醉系统是一套以数字形式与医院信息系统&#xff08;如HIS、EMR、LIS、PACS等&#xff09;和医疗设备等软、硬件集成并获取围手术期相关信息的计算机系统&#xff0c;其核心是对围手术期患者信息自动采集、储存、分析并呈现。该系统通过整合围手术期中病人信息、人员信息、…

windows11使用docker部署安装minio

时间 2023-11-08 windows11使用docker部署安装minio 目录 1.docker 下载镜像2.docker安装镜像3.访问控制台4.安装问题解决5.使用教程 1.docker 下载镜像 调整镜像源到国内&#xff0c;否则会很慢 docker pull minio/minio2.docker安装镜像 设置用户名和密码时需要注意&…

Flutter android和ios闪屏页配置

一.概念理解 闪屏页 1.当点击app开始的一瞬间&#xff0c;所呈现出来的页面就是闪屏页。 2.为什么会有闪屏也&#xff0c;由于app启动需要加载代码&#xff0c;这个过程需要耗时&#xff0c;在没有加载完成之前&#xff0c;是看不到app真正的页面。所以app在没有完全加载完时…

22款奔驰GLE450升级23P驾驶辅助 智能L2领航

驾驶辅助和自动驾驶的区别就是需要人为去接管&#xff0c;虽然车辆会根据道路自己行驶&#xff0c;弯道上也能居中自动修正行驶&#xff0c;长时间不接管方向盘&#xff0c;系统会提示人为接管&#xff0c;这就是奔驰的23P驾驶辅助系统&#xff0c; 很多车友升级23P驾驶辅助系统…

Power Apps-创建表头样式

点击上方插入中的文本标签&#xff0c;双击编辑文字&#xff0c;右侧边栏可以编辑样式&#xff08;颜色中第一个选择字体颜色&#xff0c;第二个选择组件背景色&#xff09;