关于C++STL的总结(基础使用和底层原理)

news2024/12/22 19:29:02

STL是什么?

STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件:

  1. 容器
  2. 算法
  3. 迭代器
  4. 仿函数
  5. 适配器
  6. 空间配置器

本篇重点介绍容器的使用和简单的底层实现原理,其它的部分简略带过
六大组件互相的关系大致如下图:
在这里插入图片描述


容器

容器即是存储数据的类模板,本质即是封装了常用的数据结构,主要可以分为两类:

  • 序列式容器
    关联式容器将相同类型的元素以有序的方式线性组织起来,如下:
    1. vector:动态数组,支持快速的随机访问
    2. deque:双端队列,支持快速插入和删除
    3. list:双向循环链表,支持快速插入和删除,但不支持随机访问
  • 关联式容器
    1. set/multiset:集合/多重集合(key形式)
    2. map/multimap:映射/多重映射(key-value形式)
    3. unordered_set/unordered_multiset:无序集合/无序多重集合
      unordered_map/unordered_multimap:无序映射/无序多重映射(哈希表)

还有些常见的“容器”,如stack/queue和priority_queue,这些则是属于容器适配器的组件,它们是在基本容器(vector,deque等)之上提供特定接口的适配器


迭代器

什么是迭代器?迭代器本质就是用于遍历和操作容器中的元素的一种工具,它提供了访问容器元素的方法,可以简单理解为数组名(即指针)
为什么需要迭代器?迭代器最重要的意义是提供了一种统一的方式来操作容器中的元素,无需在意元素类型,底层数据结构实现细节,都通过迭代器来进行访问
迭代器的类型大致分为以下五种:

  1. 单向迭代器:仅支持++操作(forward_list)
  2. 双向迭代器:仅支持++和–操作(list)
  3. 随机访问迭代器:支持+和-的操作(deque、vector)
  4. 反向迭代器:即与正向迭代器相反的操作的迭代器
  5. 常量迭代器:不支持修改的迭代器

不同的迭代器只是性质不一样,但使用起来时都是相同的使用iterator进行操作,iterator底层的实现可能是指针,也可能是封装的其它数据结构,如list的迭代器封装的即是链表节点,无论封装的什么,都是为了统一访问元素的方式


算法、仿函数

算法和仿函数即是为了方便C++开发,提前写好的一些常用算法和“函数”,便于使用
算法常见的即sort,swap,max/min等,详情可以去看官方文档,重点说一下仿函数

  • 什么是仿函数?
    仿函数又被称为函数对象,本质是一个类,重载了函数调用运算符operator(),使得这个类的对象可以像函数一样被调用,故此又称仿函数

  • 常见的即自定义Compare比较类,实例如下(实际中可以提供更多样不同的类型的比较)

    class Compare {
    public:
        bool operator()(int num1, int num2) {
            return num1 < num2;
        }
    };
    
    int main() {
        Compare cmp;
        std::cout << cmp(1, 2) << std::endl;  
       	sort(v.begin(), v.end(), Compare());
    	sort(v.begin(), v.end(), greater<int>());
    	for(auto i : v){
    		cout << i << endl;
    	}
    	sort(v.begin(), v.end(), less<int>());
    	for(auto i : v){
    		cout << i << endl;
    	}
        return 0;
    }
    
    
    

实例中的less和greater即是functional中为我们提供的仿函数类,一般都是用于sort等函数的函数比较器使用


适配器和空间配置器

适配器

在C++的STL中,适配器是一种设计模式,它的目的是使得原本接口不兼容的类可以一起工作。在STL中,适配器主要有三种类型:

  1. 容器适配器:容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能²。例如,stack是一个封装了deque容器的适配器类模板,默认实现的是一个后入先出(Last-In-First-Out,LIFO)的压入栈⁴。queuestack大同小异,只是开放的函数是符合先进先出(FIFO)原则的函数。

  2. 函数对象适配器:函数对象适配器可以将一般迭代器的赋值(assign)操作,转化为插入(insert)操作²。有专司头端插入的front_insert_iterator,专司尾部插入的back_insert_iterator,还有就是insert_iterator,其可以实现从任意位置执行插入操作。

  3. 迭代器适配器:迭代器适配器可以将迭代器绑定到一个stream(数据流)对象身上。绑定到istream对象(例如std::cin)者,称为istream_iterator,拥有输入能力;绑定到ostream对象(例如std::cout)者,称为ostream_iterator,拥有输出能力。


空间配置器

C++的STL中的空间配置器是一个非常重要的组件,它负责内存的配置和管理。空间配置器的存在可能平常并不太能感知到,但其为STL的操作对象提供了存储空间(内存池)。

什么是空间配置器?
空间配置器是一个实现了动态空间配置、空间管理、空间释放的class template。它的主要任务是为STL容器分配和释放内存。

为什么需要空间配置器?
空间配置器的存在可以帮助我们更有效地管理内存。它可以解决小块内存频繁申请释放带来的性能问题,以及小块内存带来的内存碎片问题。

空间配置器是如何工作的?
STL的空间配置器有两级:第一级配置器和第二级配置器。

  1. 第一级配置器:当配置区块大于128bytes时,将其视作足够大,直接使用malloc和free。

  2. 第二级配置器:当配置区块小于128bytes时,将其视作过小,为降低额外负担,采用内存池的管理方式。内存池的思想是一次向heap申请一块很大的内存,如果申请小块内存的话就直接到内存池中去要。

在STL中,空间配置器的基本操作包括:

  • 内存配置:由成员函数allocate()负责。
  • 内存释放:由成员函数deallocate()负责。
  • 对象构造:由成员函数construct()负责。
  • 对象析构:由成员函数destroy()负责。

关于容器的详解后续会补充STL各个常用的容器的模拟实现,以此了解其底层原理(待)

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

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

相关文章

不容忽视的听力“杀手”

音乐与短视频已成为现代生活的重要组成部分&#xff0c;许多人在繁忙的日常中依赖耳机来获得片刻的宁静或激情。然而&#xff0c;我们也需要警惕&#xff0c;不当的耳机使用可能对我们的听力造成风险。长时间以高音量使用耳机&#xff0c;无疑会对听力构成挑战。 *图片源于网络…

贪吃蛇项目实战——学习详解

前言:贪吃蛇是一个经典的游戏&#xff0c; 本节将使用c语言实现一个简易的的贪吃蛇小游戏。 本节内容适合已经学完c语言还有数据结构链表的友友们。 我们要实现的贪吃蛇是在控制台进行游戏的。 它运行起来是这样的&#xff1a; 贪吃蛇 那么&#xff0c; 为了实现这个小游戏。 我…

图解KMP算法——字符串搜索

原文&#xff1a;最初发布地址 一、问题描述 来源&#xff1a;Leetcode 难度&#xff1a;中等 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 hays…

2024年最新版云开发cms开通步骤,开始开发微信小程序前的准备工作,认真看完奥!

小程序官方有改版了&#xff0c;搞得石头哥不得不紧急的再新出一版&#xff0c;教大家开通最新版的cms网页管理后台 一&#xff0c;技术选型和技术点 1&#xff0c;小程序前端 wxml css JavaScript MINA原生小程序框架 2&#xff0c;数据库 云开发 云数据库 云…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌&#xff0c;具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节&#xff0c;为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备&#xff0c;其触摸屏是用户交互的重要界面…

程序员读的经典著作有哪些?

一、程序员读的经典著作有哪些&#xff1f; 在编程的世界里&#xff0c;阅读经典著作不仅能够帮助我们深入理解编程的本质&#xff0c;也能为我们提供解决问题的新思路和方法。以下是几本被广大程序员推崇的经典著作&#xff0c;每本书都有其独特的价值和深远的影响。 1. 《代…

【C++】双指针算法:快乐数

1.题目 题目中一定要理解快乐数的含义&#xff0c;否则题目难度直逼困难。 在示例1中n19&#xff0c;经过几步操作后结果变成1。 那么示例2中n2是什么情况呢&#xff1a; 2->4->16->37->58->89->145->42->20->4(与前面的4形成闭环) 在计算机中in…

苍穹外卖day11 Apache ECharts 数据统计-图形报表

文章目录 前言一、Apache ECharts二、营业额统计1. 业务规则2. 接口设计3. 代码实现 三、用户统计1. 业务规则2. 接口设计3. 代码实现 四、订单统计1. 业务规则2. 接口设计3. 代码实现 五、销量排名Top101. 业务规则2. 接口设计3. 代码实现 前言 作为后端开发人员使用Echarts&…

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容&#xff1a;类的六个默认成员函数中…

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历&#xff0c;也称广度优先搜索&#xff0c; BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 像这种较为…

Go语言并发控制

channel // cancelFn 数据通道关闭通知退出 func cancelFn(dataChan chan int) {for {select {case val, ok : <-dataChan:// 关闭data通道时&#xff0c;通知退出// 一个可选是判断data指定值时退出if !ok {fmt.Printf("Channel closed &#xff01;&#xff01;&…

前端页面助手 (vue)

快速开发页面&#xff08;图形化开发页面&#xff09; 自主编辑 然后自己也可以修改属性 最后导出页面即可 github地址 ;https://github.com/opentiny/tiny-engine

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

前端开发攻略---实现发送手机验证码60s倒计时效果(手机号验证+按钮文字自定义显示+Vue2写法+Vue3写法)

1、演示 2、说明 1、为了便于演示&#xff0c;本示例将在3秒后就再次发送。您可以根据需要自定义此时间间隔。 2、采用最少的变量以满足需求&#xff0c;以减少内存占用。 3、不仅仅局限于按钮情况&#xff0c;也可应用于不禁用按钮的情况&#xff0c;以实现更多的扩展性。 4、…

02 VMware下载安装银河麒麟(Kylin)系统

02 VMware下载&安装银河麒麟&#xff08;Kylin&#xff09;系统 一、官网1、官网地址 二、下载1、官网下载&#xff08;1&#xff09;服务器操作系统&#xff08;2&#xff09;申请试用&#xff08;3&#xff09;产品试用申请&#xff08;4&#xff09;点击下载连接即可 2、…

Redis篇:缓存穿透以及解决方案

1.何为缓存穿透 缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 比如查询一个id 0的数据&#xff0c;这是在redis和数据库中肯定不存在的&#xff0c;这样就属于缓存穿…

vue2+vxe-table实现表格增删改查+虚拟滚动

vue2vxe-table实现表格增删改查虚拟滚动 使用的vxe-table版本&#xff1a;v3.x (vue 2.6 长期维护版) 完整代码 <template><div><vxe-toolbar ref"xToolbar" export :refresh"{query: findList}"><template #buttons><vxe-b…

【网络安全】在网络中如何对报文和发送实体进行鉴别?

目录 1、报文鉴别 &#xff08;1&#xff09;使用数字签名进行鉴别 &#xff08;2&#xff09;密码散列函数 &#xff08;3&#xff09;报文鉴别码 2、实体鉴别 鉴别(authentication) 是网络安全中一个很重要的问题。 一是要鉴别发信者&#xff0c;即验证通信的对方的确是…

富唯智能:打造未来机器人教育新标杆

随着科技的飞速发展&#xff0c;机器人教育正逐渐成为培养未来人才的重要领域。富唯智能&#xff0c;作为业内领先的机器人技术提供商&#xff0c;近日推出了一款全新的机器人教育实践平台系统&#xff0c;旨在为学生提供更加丰富、更具挑战性的学习体验。 该平台系统以AUBO-i5…

A Neural Span-Based Continual Named Entity Recognition Model

《A Neural Span-Based Continual Named Entity Recognition Model》------------AAAI’23 论文链接&#xff1a;https://arxiv.org/abs/2302.12200 代码&#xff1a;https://github.com/Qznan/SpanKL 当前问题&#xff1a; 1.现有的NER模型在适应新的实体类型时往往表现不佳…