当前位置: 首页 > news >正文

C++的Odyssey之旅——STL

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的不足。 

相关文章:

C++的Odyssey之旅——STL

W...Y的主页 😊 代码仓库分享💕 🍔前言:我们已经将基本语法了解的差不多了,现在我们就该进入C中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这…...

μC/OS-II---内核:多任务与调度

目录 内核:多任务(ucos_ii.h文件的函数)Task创建Task创建(扩展)Task删除/请求删除Task改变Task优先级Task挂起和恢复Task信息获取Task调度器上锁和开锁 内核:调度(oc_core.c文件的函数&#xff…...

【紫光同创国产FPGA教程】——PDS安装教程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 一:软件简介 PangoDesign Suite是紫光同创基于多年FPGA开发软件技术攻关与工程实践经验而研发的一款拥有国产自主知识产权的大规模FPGA开…...

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前,结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等,在研发全流程中,已经沉淀了对应的质量保障的实践经验,并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…...

基于Jaccard相似度的推荐算法---示例

目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示 import pandas as pd import numpy as np# 读取CSV文…...

基于指数分布算法的无人机航迹规划-附代码

基于指数分布算法的无人机航迹规划 文章目录 基于指数分布算法的无人机航迹规划1.指数分布搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用指数分布算法来优化无人机航迹规划。 …...

vite基础学习笔记:13.Dialog 对话框 (用户注册与登录)

说明:自学做的笔记和记录,如有错误请指正 1. Dialog 对话框组件 目标效果:点击“登录/注册”,弹框 (1)创建全局组件,在官网中查询代码粘贴 (2) 注册和使用全局组件 &a…...

RedisTemplate 使用 pipeline 时需要注意的问题

RedisTemplate 使用 pipeline 时需要注意的问题 RedisTemplate 使用 pipeline 进行批量 set 时,需要把 key 和 value 都转为字节 1. 直接使用 getBytes() 转为字节,在读取数据时,会抛出以下序列化异常 //错误代码 protected void process(…...

uniapp 下载文件到手机

下载后端传递过来的文件 let thil this uni.showLoading({title: 下载中,mask:true }) uni.downloadFile({url: 接口地址, //仅为示例,并非真实的资源header: {"Authorization": token},responseType: blob,success: (res) > {if (res.statusCode 2…...

使用Drupal管理小型项目?试试Docker快速部署Drupal结合内网穿透实现远程访问

🎬 鸽芷咕:个人主页 🔥个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal…...

BSP-STM32移植FreeRTOS

在stm32裸机工程中的Middlewares目录添加freeRtos源码 在裸机工程中的main中调用freertos接口...

【Spring】Spring IOCDI(万字详解)

文章目录 1. Spring是什么?2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…...

ts 使用泛型来做类型映射

使用泛型来做类型映射&#xff0c;将对象(或数组)中类型转换为另一个类型 首先&#xff0c;定义一个类型Student // 定义一个类型Studentinterface Student {name: string,age: number}1、把Student的所有属性都变为可空的 type Nullable<T> {[p in keyof T]: T[p] || …...

Compose - 使用 Paging

一、添加依赖 查看官方最新版本 val paging_version "3.2.1" implementation("androidx.paging:paging-runtime:$paging_version") implementation("androidx.paging:paging-compose:$paging_version") 二、定义数据源 PagingSource 是对其它…...

数据结构与算法-(11)---有序表(OrderedList)

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…...

佳易王会员管理系统软件如何下载,基本功能有哪些

一、佳易王会员管理软件大众版 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &#xff1a;可以自由设置卡的类型&#xff0c;比如&#xff1a;充值卡、计次卡、…...

docker搭建mysql环境

1. 基础环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 2. 下载安装 使用docker命令下载mysql镜像 [rootzhouwei ~]# docker pull mysql:8.0.29查看docker仓库是否已经下载了mysql镜像 [rootzhouwei ~]# docker images将mys…...

优思学院|推行精益六西格玛困难重重?7大原因分析助你避坑

六西格玛&#xff0c;是一种让企业在绩效管理的舞台上跳得更高更远的方法。它不仅仅是一套原则和技术&#xff0c;更是一种对完美的执着追求。 在这个舞台上&#xff0c;企业的流程管理得以严格、集中&#xff0c;质量得以高效提升。优思学院总结出六西格玛的核心是&#xff1…...

四川思维跳动商务信息咨询有限公司可信吗?

在今天的数字化时代&#xff0c;抖音带货已成为一种全新的商业模式。许多公司都在通过这种形式进行产品推广和销售&#xff0c;其中&#xff0c;四川思维跳动商务信息咨询有限公司以其专业的服务和良好的信誉&#xff0c;在抖音带货领域赢得了广泛赞誉。 四川思维跳动商务信息…...

高防CDN与高防服务器:谁更胜一筹?

在当今数字化世界中&#xff0c;网络安全对于保护网站和应用程序至关重要。在这一背景下&#xff0c;高防CDN和高防服务器是两种流行的解决方案&#xff0c;用于应对不同类型的网络攻击。本文将分析高防CDN是否能够替代高防服务器&#xff0c;以及它们各自的优势和限制。 高防C…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...