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

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

        在 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。

相关文章:

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

在 C 语言中,很多东西都是由我们自己去实现的,例如自定义数组,线程文件操作,排序算法等等,有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…...

Linux篇:文件系统

一、共识原理: 文件文件内容文件属性 磁盘上存储文件存文件的内容(数据块)存文件的属性(inode) Linux的文件在磁盘中存储是将属性和内容分开存储的。 二、硬件简述: 1. 认识硬件 磁盘:唯一的一…...

AI - Crowd Simulation(集群模拟)

类似鱼群,鸟群这种群体运动模拟。 是Microscopic Models 微观模型,定义每一个个体的行为,然后合在一起。 主要是根据一定范围内族群其他对象的运动状态决定自己的运动状态 Cohesion 保证个体不会脱离群体 求物体一定半径范围内的其他临近物…...

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪,随时可以接受CPU的调度。阻塞状态线程处于阻塞等待,暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核,Java…...

正则表达式 通配符 awk文本处理工具

目录 什么是正则表达式 概念 正则表达式的结构 正则表达式的组成 元字符 元字符点(.) 代表字符. 点值表示点需要转义 \ r..t 代表r到t之间任意两个字符 过滤出小写 过滤出非小写 space空格 [[:space:]] 表示次数 位置锚定 例&#xff1a…...

三、ts高级笔记,

文章目录 18、d.ts声明文件19、Mixin混入20、Decorator装饰器的使用21、-高级proxy拦截_Reflect元储存22、-高级写法Partial-Pick23、Readonly只读_Record套对象24、高阶写法Infer占位符25、Inter实现提取类型和倒叙递归26、object、Object、{}的区别27、localStorage封装28、协…...

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法,但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…...

flask依据现有的库表快速生成flask实体类

flask依据现有的库表快速生成flask实体类 在实际开发过程中,flask的sqlalchemy对应的model类写起来重复性较强,如果表比较多会比较繁琐,这个时候可以使用 flask-sqlacodegen 来快速的生成model程序或者py文件,以下是简单的示例&a…...

.NET6 开发一个检查某些状态持续多长时间的类

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在代码的世界里,时常碰撞…...

链表K个节点的组内逆序调整问题

链表K个节点的组内逆序调整问题 作者:Grey 原文地址: 博客园:链表K个节点的组内逆序调整问题 CSDN:链表K个节点的组内逆序调整问题 题目描述 LeetCode 25. Reverse Nodes in k-Group 本题的 follow up 是: Fol…...

安卓隐私指示器学习笔记

最近了解到Google 在Android12上新增了权限指示器,可以在信号栏的右侧显示当前访问录音机和Camera的应用,点击后可以跳转到相应应用的权限界面,消费者可以控制权限的开启和关闭。国内手机厂商最近几年都在增加隐私看板供能,消费者…...

【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:

jenkins报错未能发送邮件到指定邮箱 注意:这是在系统配置中修改 在系统配置》邮件通知中添加配置信息 注意:这个是在项目的配置下修改 配置完成后,重新执行发送邮件成功!!!...

CSS3制作3D爱心动画

1、什么是CSS css,即层叠样式表的简称,是一种标记语言,有浏览器解释执行用来使页面变得更美观。 2、选择器 css3中新增了一些选择器,如下: 3、新样式 边框 css3新增了三个边框属性,分别是: bo…...

Python Opencv实践 - 全景图片拼接stitcher

做一个全景图片切片的程序Spliter 由于手里没有切割好的全景图片资源,因此首先写了一个切片的程序spliter。 如果有现成的切割好的待拼接的切片文件,则不需要使用spliter。 对于全景图片的拼接,需要注意一点,各个切片图片之间要有…...

echarts 几千条分钟级别在小时级别图标上展示

需求背景解决效果ISQQW代码地址strategyChart.vue 需求背景 需要实现 秒级数据几千条在图表上显示&#xff0c;(以下是 设计图表上是按小时界别显示数据&#xff0c;后端接口为分钟级别数据) 解决效果 ISQQW代码地址 链接 strategyChart.vue <!--/** * author: liuk *…...

操作系统的中断与异常(408常考点)

为了进行核心态和用户态两种状态的切换&#xff0c;引入了中断机制。 中断是计算机系统中的一种事件&#xff0c;它会打断CPU当前正在执行的程序&#xff0c;转而执行另一个程序或者执行特定的处理程序。中断可以来自外部设备&#xff08;如键盘、鼠标、网络等&#xff09;、软…...

linux下的工具---vim

一、了解vim 1、vim是linux的开发工具 2、vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行…...

代码随想录算法训练营第六十天|84. 柱状图中最大的矩形

LeetCode 84. 柱状图中最大的矩形 题目链接&#xff1a;84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 和接雨水还挺像的。 代码&#xff1a; #python class Solution:def largestRectangleArea(self, heights: List[int]) -> int:heights.insert(0, 0…...

P14 C++局部静态变量static延长生命周期

目录 01 前言 02 变量的作用域与生命周期 2.1 什么是作用域&#xff1a; 2.2 什么是变量的生命周期&#xff1a; 03 局部静态 3.1非静态变量例子 3.2静态变量例子 04 全局变量 05 后话 01 前言 在前几期里&#xff0c;我们了解了static关键字在特定上下文中的含义。 …...

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...