初识STL(标准模板库)

news2025/2/25 5:53:45

目录

​编辑

什么是STL

STL的版本

 STL的六大组件

如何学习STL

STL的优势

 

STL的缺陷

 



 

⭐什么是STL

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

⭐STL的版本

  • 原始版本
    • Alexander StepanovMeng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使 用。 HP 版本--所有STL实现版本的始祖。
  • P. J. 版本
    • P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。
  • RW版本
    • Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
  • SGI版本
    • Silicon Graphics Computer SystemsInc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好, 可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码, 主要参考的就是这个版本。

 ⭐STL的六大组件

STL大体分为六大组件,分别是:容器算法迭代器仿函数适配器(配接器)空间配置器

容器:

容器是用于存储数据的类模板。STL提供了多种不同类型的容器,每种容器都设计用于特定的使用场景,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法:

STL提供了一系列通用算法,这些算法可以作用于容器中的元素。这些算法大多是与容器类型无关的,包括排序、搜索、修改序列、数值运算等。从实现的角度来看,STL算法是一种function tempalte.

迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。

仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template

适配器(配接器):适配器是特殊类型的容器,它们提供了不同的接口或行为,基于其他容器实现。

空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

⭐如何学习STL

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

⭐STL的优势

  1. 高效性

    • STL的数据结构和算法经过精心设计和优化,以保证运行时的高效性。例如,std::vector在尾部添加元素通常是常数时间复杂度,而std::sort算法实现了高效的快速排序算法。
    • 这意味着,在执行时间和资源使用上,STL能够提供出色的性能,这对于需要高效处理大量数据的应用程序来说是非常重要的。
  2. 复用性

    • STL的组件是模板化的,这意味着它们可以用于不同的数据类型,而不需要为每种数据类型重新实现逻辑。
    • 这种设计减少了重复代码,使得开发者能够重用现有的数据结构和算法,加快开发进程并减少错误。
  3. 泛型编程

    • 通过模板,STL支持泛型编程,允许开发者编写独立于特定数据类型的代码。这增加了代码的通用性和灵活性。
    • 泛型编程还意味着,同一套代码可以适用于多种数据类型,从而提高了代码的复用性和可维护性。
  4. 大量的算法

    • 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/1528982.html

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

相关文章

C语言笔记:函数与程序结构

目录 ACM金牌带你零基础直达C语言精通-课程资料 一.作用域的基本概念 二.函数 1. 函数的定义和使用 2.为什么一定要有函数结构 3.形参与实参 4.函数的声明和定义 5.递归函数 此代码中递归函数执行流程: 练习:求斐波那契数列第n项的值: 欧几里…

洛谷_P1104 生日_python写法

P1104 生日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点: 还是自定义规则的排序,然后这里还有python中如何在一行中输入多种类型的数据。 n int(input()) data [] num 1 for i in range(n):img list(input().split())s img[0]y int(img…

【unity与android的交互】移动游戏发布更安心!Unity安卓平台打包相关的常见参数全详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

深度学习500问——Chapter03:深度学习基础(3)

文章目录 3.5 Batch Size 3.5.1 为什么需要 Batch size 3.5.2 Batch Size 值的选择 3.5.3 在合理范围内,增大Batch Size有何好处 3.5.4 盲目增大 Batch Size有何坏处 3.5.5 调节Batch Size对训练效果影响到底如何 3.6 归一化 3.6.1 归一化含义 3.6.2 为什么…

大模型知识库

一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 1. 下载Langchain-chatchat git clone https://github.com/chatchat-space/Langchain-Chatchat/ 2. 下载大模型和embe…

打开Railway神奇大门:Railway免费注册部署全面教程

🧙‍♂️ 诸位好,吾乃斜杠君,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &#…

React——开发者工具

浏览器插件:谷歌浏览器插件react-devtools 方式1:chrome应用商店添加 方式2:下载安装包放在浏览器上

Redis缓存穿透的几种解决方案

目录 缓存穿透原理: 缓存穿透一般有几种解决方案: 1.缓存空值 2.使用锁 3.布隆过滤器 优缺点 布隆过滤器误判理解 布隆过滤器的简单使用流程 4.组合方案 那么当我们高并发的访问短链接或者人为的去穿透的时候呢? 最近做项目遇到了缓…

SpringBoot自动配置

EnableAutoConfiguration源码解析SpringBoot常用条件注解源码解析SpringBoot之Mybatis自动配置源码解析SpringBoot之AOP自动配置源码解析SpringBoot Jar包启动过程源码解析 SpringBoot2.6.6源码地址:SpringBoot-2.6.6: SpringBoot2.6.6 注解详解 SpringBootConfig…

【技术栈】Spring Cache 简化 Redis 缓存使用

​ SueWakeup 个人主页:SueWakeup 系列专栏:学习技术栈 个性签名:保留赤子之心也许是种幸运吧 ​ 本文封面由 凯楠📸 友情提供 目录 本栏传送门 1. Spring Cache 介绍 2. Spring Cache 常用注解 注:手机端浏览本文章…

java入门 -输入和输出

输入输出 开发中大量会使用输入和输出,今天来总结一下Java语法阶段常使用的输入和输出。 输出 System.out 控制台输出信息。 不换行显示一行: System.out.print( ); System.out.print("hello "); System.out.print("java!");运行结…

如何强健“伙伴+华为”体系?华为用六大升级给出答案

聚拢企业内部资源,可以成事;而聚拢企业内外资源,则可成势。 华为如何在NA、商业和分销三大赛道聚拢伙伴之力成势?伙伴又如何与华为一起顺势而为,获得发展和收益?这是在一年一度的“华为中国合作伙伴大会”…

MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程

文章目录 前言5.9 Mapper方法的调用过程5.10 小结 前言 上一节【MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取】已经知道,调用SqlSession对象的getMapper(Class)方法,传入指定的Mapper接口对应的Class对象…

BUU [MRCTF2020]套娃

BUU [MRCTF2020]套娃 开题&#xff0c;啥也没有。 查看网页源代码发现后端源代码&#xff1a; <?php //1st $query $_SERVER[QUERY_STRING];if( substr_count($query, _) ! 0 || substr_count($query, %5f) ! 0 ){die(Y0u are So cutE!); }if($_GET[b_u_p_t] ! 23333 &am…

Vue核心知识点 -Vue2响应式系统是基于什么实现的、以及会产生什么问题和解决方案

一、概念 在Vue 2中&#xff0c;响应式系统是基于Object.defineProperty实现的。它通过劫持对象的属性来实现数据的响应式更新。 当你将一个对象传递给Vue实例的data选项时&#xff0c;Vue会遍历对象的每个属性&#xff0c;并使用Object.defineProperty方法将其转换为getter和s…

项目总结报告-word

2 项目工作成果 2.1 交付给用户的产品 2.2 交付给研发中心的产品 2.2.1 代码部分 2.2.2 文档部分 2.3 需求完成情况与功能及性能符合性统计 2.3.1 需求完成情况统计 2.3.2 功能符合性分析 2.3.3 性能符合性分析 3 项目工作分析 3.1 项目计划与进度实施分析 3.1.1 开发进度 3.1.…

2000-2021年各省研发强度数据(原始数据+计算结果)(无缺失)

2000-2021年各省研发强度数据&#xff08;原始数据计算结果&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;RD经费内部支出&#xff08;万元&#xff09;、国内生产总值、研发强度 3、范围&#xff1a;31省 4、来源&#…

【源码阅读】EVMⅢ

参考[link](https://blog.csdn.net/weixin_43563956/article/details/127725385 大致流程如下&#xff1a; 编写合约 > 生成abi > 解析abi得出指令集 > 指令通过opcode来映射成操作码集 > 生成一个operation 以太坊虚拟机的工作流程&#xff1a; 由solidity语言编…

数据库系统概论-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下数据库系统概论中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 数据库系统概论系列文章传送门&#xff1a; 第一章 绪论 第二/三章 关系数据库和标准语言SQL 第四/五章 数据库安全性和完整性…