C++标准模板库 STL 简介(standard template library)

news2024/11/28 2:45:17
        在 C 语言中,很多东西都是由我们自己去实现的,例如自定义数组,线程文件操作,排序算法等等,有些复杂的东西实现不好很容易留下不易发现的 bug。而 C++为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器,使用者使用容器的时候就不需要去注意代码的细节实现,使用容器也会更加安全和高效。
        容器的实现就是靠模板类去实现的,例如 C++中的动态数组容器 vector,它其实就是一个类,类中维护了一块地址,然后类中的函数就可以定义为一些数组的行为,例如添加元素,删除元素等等,同时相比于 C 语言中的数组,使用容器因为是类在维护,所以,类中一般会进行安全性判断,对一些不安全的操作会进行规避,例如:C 语言中的数组 a 可以访问 a[-1],但是对于 C++中的容器 a,访问 a[-1]就会被拒绝.
        C++的容器 分别为算法、容器、函数、 迭代器

STL 的优点

1.功能强大、代码精致。STL 由惠普实验室的无数大牛们开发,设计精巧,功能强大,集成了 优秀的算法。
2.高可重用性。 STL 广泛使用模板泛型编程,代码具有高度的复用性。
3.高性能、工业强度。 STL 提供的算法具有工业强度,高性能,用它可开发出性能高效的应用程序。
4.开源跨平台. STL 跨平台,而且开源,开发者可以很容易借鉴与扩展。

STL 的版本

1.HP STL
        HP STL 是 Alexandar Stepanov 在惠普 Palo Alto 实验室工作时,与 Meng Lee 合作完成的。 HP STL 是 C++ STL 的第一个实现版本,而且是开放源码。其它版本的 C++ STL 一般是以 HP STL 为蓝本实现出来的。
2.SGI STL
        由 Silicon Graphics Computer Systems 公司参照 HP STL 实现,主要设计者仍然是 STL 之父 Alexandar Stepanov,被 Linux 的 C++编译器 GCC 所采用。SGI STL 是开源软件,源码可读性甚高。
3.STLport
        为了使 SGI STL 的基本代码都适用于 VC++和 C++ Builder 等多种编译器,俄国人 Boris Fomitchev 建立了一个 free 项目来开发 STLport,此版本 STL 是开放源码的。
4.P.J.Plauger STL
        由 P.J.Plauger 参照 HP STL 实现出来,被 Visual C++编译器所采用,但不是开源的。
5.Rouge Wave STL
        由 Rouge Wave 公司参照 HP STL 实现,用于 Borland C++编译器中,这个版本的 STL 也不 是开源的。

STL 的六大组件

        1、容器(Containers):各种数据结构,如 Vector,List,Deque,Set,Map,用来存放数据,STL 容 器是一种 Class Template,就体积而言,这一部分很像冰山载海面的比率。
        2、算法(Algorithms):各种常用算法如 Sort,Search,Copy,Erase,从实现的角度来看,STL 算法是一种 Function Templates。
        3、迭代器(Iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类 型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:Operators*,Operator->,Operator++,Operator–等相关操作予以重载的 Class Template。所有STL 容器都附带有自己专属的迭代器,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。
        4、仿函数(Functors): 行为类似函数,可作为算法的某种策略(Policy),从实现的角度来看,仿函数是一种重载了 Operator()的 Class 或 Class Template。一般函数指针可视为狭义的
仿函数。
        5、配接器(适配器)(Adapters):一种用来修饰容器(Containers)或仿函数(Functors) 或迭代器(Iterators)接口的东西,例如:STL 提供的 Queue 和 Stack,虽然看似容器,其实只能算是一种容器配接器,因为 它们的底部完全借助 Deque,所有操作有底层的 Deque 供应。 改变 Functor 接口者,称为 Function Adapter;改变 Container 接口者,称为 Container Adapter; 改变 Iterator 接口者,称为 Iterator Adapter。配接器的实现技术很难一言蔽之,必须逐一分析。
        6、分配器(Allocators):负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 Class Template。

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

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

相关文章

任意文件上传漏洞挖掘(getshell)

任意文件上传漏洞挖掘(getshell) 1.在漏洞挖掘过程中进行找到该子域名页面, 2.没有内容就扫目录,成功发现filemanager/,点击访问 看到upload页面感觉有惊喜, 果然有上传功能,点击上传抓包,经测试发现普通j…

【第六节:微信小程序 小程序UI组件C】微信小程序入门,以思维导图的方式展开6

如果图文字看不清,可以私信我给发大图哈。 6、小程序UI组件C 导航(Navigation) navigator 应用链接 url String 应用内的跳转链接 open-type String navigate 可选值 navigate、redirect、switchTab、reLaunch&#…

RAM++(recognize anything++)—— 论文详解

一、概述 1、是什么 RAM(RAM plus plus)论文全称 《Open-Set Image Tagging with Multi-Grained Text Supervision》。区别于图像领域常见的分类、检测、分割,他是标记任务——多标签分类任务(一张图片命中一个类别)&…

【我的创作纪念日】

机缘 大家好,我是圥忈ゼ, 2023 年 07 月 20 日,我撰写了第 1 篇技术博客:《我的编程未来规划》,也是由于我高考后的专业选择,和就业方向的选择,加上想立志成为一名专业 IT 作者,我结…

Docker | Docker部署MySQL

Docker | Docker部署MySQL ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列…

Python交互式解释器及用法

为了让开发者能快速学习、测试 Python 的各种功能,Python 提供的“python”命令不仅能用于运行 Python 程序,也可作为一个交互式解释器一一开发者逐行输入 Python 代码,它逐行解释执行。 当输入“python”命令时,可以看到如下输出…

IDEA的安装与删除插件

不小心安装了一个英文转中文的插件,看不习惯,决定重新变回英文 先点击这个settings的安装 然后就看到这个下面这张图了 如果是安装就点install,不用了就和我一样把这个勾给去掉

计算计能力挑战赛选择题真题(2020、2021、2022)

2020 1.关于联合体和结构体错误的是(a) a.联合体union的存放顺序是所有成员都从高地址开始存放的(x) (ps:联合体union的存放顺序是所有成员都从低地址开始存放的) b.联合体中可以定义多个成员,联合体的大小由最大的成员的大小决定。 c.可以使用匿名…

ChatGLM2详细安装部署(chatglm2大模型安装步骤三)

ChatGLM2安装部署 1.服务器配置 服务器系统:Centos7.9 x64 显卡:RTX3090 (24G) 虚拟环境:Miniconda3 2.安装部署 2.1 ChatGLM2下载 输入命令:git clone https://github.moeyy.xyz/https://github.com/THUDM/ChatGLM2-6B.git 输入命令:cd ChatGLM2-6B 注:https://g…

瓶盖内的条码需要注意哪些?,才能帮助企业有效搭建与消费者沟通~

在不断发展的消费品领域,特别是饮料行业,组织不断寻求创造性的方法来扩大客户参与度、增强品牌忠诚度并消除假冒产品。一种获得认可的新兴方法是在瓶盖和瓶盖上实施DataMatrix 条形码扫描。这种创新方法提供了许多好处,从改善消费者互动到强化…

idea 旧项目替换成新项目(项目名称,模块,代码)

文章目录 修改项目名替换模块、文件前缀全局替换包名局部替换xml、yml等其他文件 修改项目名 右击项目名称->Refactor->Rename(shiftF6) ctrlaltshifts 替换模块、文件前缀 git bash执行如下脚本 #/bin/bash # 单目录替换 for f in old-prefix*; do mv "$f…

用java实现王者荣耀

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo…

openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项

文章目录 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项133.1 检查openGauss状态133.2 检查锁信息133.3 统计事件数据133.4 对象检查133.5 SQL报告检查133.6 备份133.7 基本信息检查 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项 …

SEOAI每周资讯和Linus思考 231127

欢迎查看 Linus筋斗云SEO 的每周资讯整理,本周的一些要点: Google11月核心更新和评论更新仍然没有结束9个搜索结果页的主要变化:图标、品牌、粉丝数、新模块GSC已索引页面狂掉?Google的问题,已修复黑五网一期间的搜索…

域名邮箱与企业邮箱的区别:功能、应用与优势

根据使用者的不同需求,电子邮件分为域名邮箱和企业邮箱两种类型。那么这两种邮箱之间究竟存在哪些区别呢?本文将从定义、优势和劣势三个方面进行详细解析。 什么是域名邮箱? 域名邮箱,顾名思义是以域名作为后缀的电子邮箱。域名邮…

vue 表格虚拟滚动

参考未整理 1.使用vxetable实现 官网 问题&#xff1a; 实现了表格的虚拟滚动&#xff0c;但是单元格数据不自动换行了 &#xff0c;如下显示的... 然后在官网看到是这样的&#xff0c;那我不是白写。。。 解决&#xff1a; 1.包一层div2.再写个换行样式 <vxe-column …

SPSS多维尺度分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

java编程:⼀个⽂件中存储了本站点下各路径被访问的次数,请编程找出被访问次数最多的10个路径

题目 编程题&#xff1a;⼀个⽂件&#xff08;url_path_statistics.txt&#xff09;中存储了本站点下各路径被访问的次数 请编程找出被访问次数最多的10个路径时间复杂是多少&#xff0c;是否可以优化&#xff08;假设路径数量为n&#xff09;如果路径访问次数⽂件很⼤&#x…

深度学习中小知识点系列(二) 解读仿射变换和透视变换

综述 所有复杂的东西&#xff0c;都是由基本的组成的。所以我们需要先了解一下基础的变换有哪些&#xff1a; 平移 我们对矩形&#xff08;图像&#xff09;平移&#xff0c;需要怎么做&#xff1f; 对每一个像素点坐标平移。可以让每一个像素点的x,y坐标都加一个变量。 矩…

我叫:归并排序【JAVA】

1.认识我一下 1.归并排序(MERGE-SORT)利用归并的思想实现的排序方法,该算法采用经典的分治策略2.分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之。 2.分合思想 3 分久必合 /*** 合并** param arr …