STL六大组件

news2024/9/24 5:28:08

         STL(Standard Template Library,标准模板库)是C++标准库的一部分,提供了丰富且高效的数据结构和算法。STL主要由6大组件构成,分别是容器、算法、迭代器、适配器、仿函数和空间配置器


容器(Containers)

        STL提供了多种不同类型的容器,如vector、list、deque、set、map等,用于存储和管理数据。这些容器提供了不同的特性和性能,可以根据具体需求选择合适的容器。 

        容器可分为三类:

        ① 顺序容器(sequence containers),主要包括array、vector、deque、list、forward_list;

        ② 关联容器(associative containers),内部机理是树或哈希表,元素是键值对,所以其搜索的时间复杂度较低,特别适合用于查找操作。主要包括set、multiset、map、multimap; 

        ③ 无序(散列)容器(UNordered containers),内部机理是哈希表,在c++11推出。元素的位置不重要,重要的是这个元素是否在这个容器里面,主要适用于查找;主要包括:underde_set、unordered_multiset、unordered_map、unordered_multimap; 

        library Containers

        在这些容器中,最常用的就是string、vector、list以及map、set、unordered_map、unordered_set,需要熟悉这些容器的操作方法。


迭代器(Iterators)

        迭代器是STL中用于遍历容器元素的工具,提供了统一的访问接口,使得算法可以以通用的方式操作各种容器。 迭代器以统一的方式来访问容器,而不需要了解其中的细节,体现了封装的特性

template <class Category, class T, class Distance = ptrdiff_t,
          class Pointer = T*, class Reference = T&>
  struct iterator {
    typedef T         value_type;
    typedef Distance  difference_type;
    typedef Pointer   pointer;
    typedef Reference reference;
    typedef Category  iterator_category;
  };

        从使用的角度分类,我们可以把正向迭代器、反向迭代器和是否为const属性组合成4种迭代器类型;

        从功能的角度,我们可以把迭代器分为输入迭代器、输出迭代器、单向迭代器、双向迭代器和随机访问迭代器等不同类型

        容器中使用单向迭代器的有forward_list、unordered_map、…… 。单向迭代器只支持++操作;

        使用双向迭代器的有list、map、set、……,支持++和--操作;

        使用随机迭代器的有srting、array、vector、deque……,支持++、--和+、-操作。(+、-操作指的是可以直接+1、-3这种算数操作)。

        这几种迭代器是一种包含的关系


算法(Algorithms)

        STL包含了大量的算法,如排序、查找、遍历等,可以在不同的容器上进行操作。这些算法具有高度的重用性和通用性,帮助开发者快速实现各种常见的操作。 

        Standard Template Library: Algorithms 

        算法是否能作用于一种容器上,是与该容器的迭代器类型息息相关的,一种容器不一定能使用全部的算法。

 


适配器(Adapters) 

        适配器可以在已有的容器或算法之间提供一个接口层,以实现不同组件之间的互操作。常见的适配器有stack、queue和priority_queue等,它们提供了不同的数据结构和访问方式。

 


仿函数(Functors) 

        仿函数是STL中的一个重要概念,它允许将函数对象作为参数传递给算法,从而实现更加灵活和通用的操作。STL提供了一些内置的仿函数,同时也支持用户自定义的仿函数。

        仿函数是一种具有函数特征的对象,调用者可以像函数一样调用该对象。为了能够“行为类似于函数”,该对象所在类必须自定义函数调用运算符operator(),重载该运算符后,就可以在仿函数对象的后面加上一对小括号,以此调用仿函数所定义的operator()操作,就其行为而言,"仿函数"一词更贴切。

        仿函数一般配合算法和容器以提高灵活性

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};


空间配置器(Allocators)

        分配器是STL中用于内存管理的组件,负责为容器分配和释放内存。STL中的容器在实现时通常使用分配器进行内存分配,不同的分配器可以满足不同的内存分配策略和需求。

        空间配置器在我的这篇博客中有详细介绍:剖析SGI-STL二级空间配置器

        空间配置器可以解决外碎片的问题,但是会导致内碎片。

        针对内存碎片的问题,内核中使用一个叫做slab分配器的东西来解决,这个分配器就类似于sgi-stl二级空间配置器的自由链表结构。

        那为什么内核中已经有了slab分配器来申请小块内存,STL还要自己实现一个一样功能的的空间配置器呢?

        1、内核是针对整个系统所有进程的,效率较低;且直接向内核申请资源导致的开销是比较大的(陷入内核)。

        2、STL的容器普遍申请的都是小块内存,并且需求大小比较集中。STL自己设计一个用来分配空间,效率比较高,顺便解决外碎片的问题。

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

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

相关文章

Midjourney进阶-反推与优化提示词(案例实操)

​ Midjourney中提示词是关键&#xff0c;掌握提示词的技巧直接决定了生成作品的质量。 当你看到一张不错的图片&#xff0c;想要让Midjourney生成类似的图片&#xff0c;却不知道如何描述画面撰写提示词&#xff0c;这时候Midjourney的/describe指令&#xff0c;正是帮助你推…

AIoTedge边缘计算平台V1.0版本发布

AIoTedge边缘计算平台V1.0&#xff0c;一款创新的AIoT解决方案&#xff0c;现已正式发布。该产品集成了NodeRED软网关、边缘物联网平台和边缘AI能力&#xff0c;为企业提供强大的边云协同能力。它支持设备管理和泛协议接入&#xff0c;确保不同设备间的无缝连接。AIoTedgeV1.0还…

SQL-事务与并发问题

在数据库管理系统中&#xff0c;事务是一个重要的概念&#xff0c;它确保了一组数据库操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而维护数据的完整性和一致性。随着多个用户同时访问数据库&#xff0c;事务的并发处理变得尤为重要。 1. 事务的定义 事务是指一组…

一文读懂推荐系统

随着互联网的飞速发展&#xff0c;信息过载已经成为了一个普遍的问题。我们每天都要面对大量的内容&#xff0c;却很难找到真正符合自己兴趣和需求的信息。这时&#xff0c;推荐系统应运而生&#xff0c;它能够根据用户的兴趣和行为&#xff0c;智能地推荐相关内容&#xff0c;…

​与辉同行2日破亿,打工就是在浪费生命,真让罗永浩说对了!​

去年东方甄选的小作文事件发生之后 罗永浩就鼓励董宇辉出来单干还发表了惊天言论&#xff0c;“打工就是在浪费生命” 董宇辉接手“与辉同行”公司后&#xff0c;两天直播总销售额就已经超过了1亿元 难道真让罗永浩说对了&#xff0c;打工就是在浪费生命吗&#xff1f; 打工…

20240819解决飞凌的OK3588-C的核心板的适配以太网卡RTL8211F-CG在百兆模式下通过交换机上外网

20240819解决飞凌的OK3588-C的核心板的适配以太网卡RTL8211F-CG在百兆模式下通过交换机上外网 2024/8/19 18:00 缘由&#xff1a;由于自制的飞凌的OK3588-C的核心板的底板对空间要求高/敏感&#xff0c;并且对网速要求不高&#xff0c;百兆即可满足要求。 也就直接使用千兆网卡…

质量体系 | 这些医疗器械质量管理标准/法规有什么区别?

在医疗器械行业中&#xff0c;确保产品质量和安全至关重要&#xff0c;而ISO 9001、ISO 13485、GMP、中国《医疗器械生产质量管理规范》和QS820等标准/法规为行业提供了明确的指导。 ISO9001 ISO9001:2015 Quality management systems-Requirements&#xff08;质量管理体系要…

通过ros2服务来控制程序的启动和关闭

运行handle.py程序&#xff0c;启动服务节点&#xff0c;调用服务节点控制程序的启动和关闭&#xff0c;本例为启动和关闭一个python程序&#xff08;每隔一秒打印hello,world&#xff09;&#xff0c;运行截图如下: 一、创建服务节点 handle.py import rclpy from rclpy.no…

无人机之航拍挑选注意事项

航拍无人机的挑选&#xff0c;主要从安全稳定、航拍画质、云台防抖、图传距离、续航时间等因素来考虑。 一、安全稳定 安全稳定性&#xff0c;是我们选择航拍无人机的首要参考标准。毕竟再好的镜头、再好的外形设计、再好的航拍功能&#xff0c;如果没有安全稳定的飞行&#x…

【若依 - 前后端不分离版】SysCaptchaController 详解:生成与处理验证码

文章目录 一、SysCaptchaController 类概述1. 类的功能2. 主要功能 二、验证码生成流程1. 接口定义2. 代码流程解析2.1. 设置响应头2.2. 生成验证码2.3. 存储验证码2.4. 返回验证码图片 三、处理异常和流关闭1. 异常处理2. 流关闭 四、实际应用中的验证码处理1. 验证码生成和展…

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

【数模修炼之旅】05 拟合模型 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 拟合模型介绍及应用 …

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案 大语言模型的训练数据一般基于公开的数据,且每一次训练需要消耗大量算力,这意味着模型的知识一般不会包含私有领域的知识,同时在公开知识领域存在一定的滞后性。为了解决这一…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

python3爬虫(未完结)

一个简单的例子&#xff1a;爬取自己的csdn博客&#xff0c;统计每篇博客的访问量&#xff0c;制作一个柱状图&#xff0c;以访问量从大到小的方式显示。 1. 首先从“个人主页”爬取所有所有文章的链接 1.1 打开个人主页&#xff0c;右键->检查&#xff1a;可以看到每篇文章…

如何使用Java SpringBoot+Vue搭建二手闲置交易系统?

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

四步解决国标设备接入问题

用国标协议完成多品牌设备统一接入&#xff0c;是智能设备在多场景应用中都会碰到的安装步骤。国标接入常常过程复杂&#xff0c;这边介绍一种相对简便的方法&#xff0c;用萤石开放平台的“国标设备添加工具”接入 Step1&#xff1a;私信我获取安装包 私信我获取国标设备添加…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景&#xff1a; 我的情况是这样&#xff0c;域名解析是华为云的&#xff0c;然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是9天)&#xff0c;申请步骤如下 主要步骤说明 申请免费SSL证书配置证书到域…

自定义变量添加到分机呼叫信息(mod_cti基于FreeSWITCH)

文章目录 前言联系我们添加流程1. 修改cti.json配置2. 配置自动外呼进入排队转坐席3. 变量同步到坐席通道 4. 导入号码添加自定义变量 前言 在默认配置中&#xff0c;分机的呼叫信息会被推送到redis的hash表中&#xff0c;hash表名&#xff1a;calls。我们可以通过修改配置&am…

【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路(Qwen2-7B-Instruct+BGE Embedding)

【大模型LLMs】RAG实战&#xff1a;基于LlamaIndex快速构建RAG链路&#xff08;Qwen2-7B-InstructBGE Embedding&#xff09; 1. 环境准备2. 数据准备3. RAG框架构建3.1 数据读取 数据切块3.2 构建向量索引3.3 检索增强3.4 main函数 参考 基于LlamaIndex框架&#xff0c;以Qwe…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …