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

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://xiahunao.cn/news/2980296.html

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

相关文章

二进制,八进制,十六进制 开头的标识符号

1、引言 每个进制开头的标识符号容易忘&#xff0c;写篇小小博客&#xff0c;拯救一下俺的小脑袋瓜子。 2、进制开头标识符号

AJAX——案例

1.商品分类 需求&#xff1a;尽可能同时展示所有商品分类到页面上 步骤&#xff1a; 获取所有的一级分类数据遍历id&#xff0c;创建获取二级分类请求合并所有二级分类Promise对象等待同时成功后&#xff0c;渲染页面 index.html代码 <!DOCTYPE html> <html lang&qu…

《QT实用小工具·三十八》QT炫酷的菜单控件

1、概述 源码放在文章末尾 非常飘逸的 Qt 菜单控件&#xff0c;带有各种动画效果&#xff0c;用起来也十分方便。 无限层级&#xff0c;响应键盘、鼠标单独操作&#xff0c;支持单快捷键。 允许添加自定义 widget、layout&#xff0c;当做特殊的 QDialog 使用。 项目demo演示…

你变了,再也不是我认识的微信小程序了!

以前做了不少的小程序&#xff0c;领导刚说要做的时候以为自己轻车熟路&#xff0c;多大点事&#xff0c;做了才发现近年来微信小程序改动还是挺多的&#xff01;不过第一感觉就是花钱的地方越来越多了&#xff01;接下来就帮大家整理一下我自己总结的有改动的地方&#xff0c;…

自动化软件测试策略

作为一名软件开发人员&#xff0c;我在不同的公司工作过&#xff0c;具有不同的软件测试流程。在大多数情况下&#xff0c;没有特定/记录的测试方法......因此该过程的内容/方式取决于各个开发人员。与大多数情况一样&#xff0c;当没有强制执行或至少记录在案的政策时&#xf…

使用立创EDA打开JSON格式的PCB及原理图

一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 文件 -> 导入 -> 嘉立创EDA标准版/专业版 三、选择.zip文件并选择 “导入文件并提取库” 四、自定义工程路径 完成导入并转换为.eprj文件 五、视频教学 bilibili_使用立创EDA打开JSO…

【保姆级教程】Windows 远程登录 Ubuntu桌面环境

前言 在Windows下远程访问Linux服务器的桌面&#xff0c;有几种常见的方法&#xff1a; xrdp&#xff08;X Remote Desktop Protocol&#xff09;&#xff1a;xrdp允许Windows使用RDP&#xff08;Remote Desktop Protocol&#xff09;来连接到Linux服务器的桌面。这种方式相对…

Jackson 2.x 系列【31】Spring Boot 集成之字典翻译

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

iptables实现docker容器动态端口映射实操

背景 之前在《Docker 动态修改容器端口映射的方法》一文中&#xff0c;说明了如何使用修改配置和加防火墙规则实现动态端口映射。但是没有具体分享加防火墙实现动态端口映射的实际案例。今天就分享一下实际操作案例&#xff0c;供大家参考。 分析 动态端口映射的用途 容器端口…

Python-GEE遥感云大数据分析、管理与可视化

原文链接&#xff1a;Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

英伟达AI系列免费公开课

英伟达公开课官网地址 Augment your LLM Using Retrieval Augmented Generation Building RAG Agents with LLMs langchain的workflow: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c90cb157c9c84bb5b3da380ec56f5c2a.png Generative AI Explained

HCIP--路由引入、路由过滤、路由策略实验

1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 loopback 口模拟业务网段 R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip add 192.168.0.1 32 [R1-LoopBack0]int l1 [R1-L…

stack、queue(priority_queue)的模拟实现和deque的简单介绍

stack和queue(priority_queue) 1. 容器适配器 适配器(Adapter)&#xff1a;一种用来修饰容器(Containers)或仿函数(Functors)或迭代器(Iterator)接口的东西。 适配器是一种设计模式&#xff0c;该模式将一个类的接口转换成客户希望的另外一个接口。 现实中拿插座来说&#xf…

Ubuntu 安装 Harbor

一、安装 docker 原文参考传送门 1st 卸载系统自带的 docker 应用 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2nd 设置Docker 的apt源 # Add Dockers official GPG key: sudo…

MySQL的root用户无法远程连接

默认root用户只允许本地连接&#xff0c;所以需要修改mysql库中user表中名为root的用户的host为“%” select Host,User from user;UPDATE mysql.user SET host % WHERE user root; FLUSH PRIVILEGES;

什么是最优物理隔离文件导出导入解决方案,来看看吧

企业进行物理隔离的主要原因是为了提高安全性&#xff0c;减少安全风险。物理隔离通常指的是将网络或系统中的关键部分与外界断开直接连接&#xff0c;以增强安全性。在企业环境中&#xff0c;这通常意味着将内部网络&#xff08;内网&#xff09;与外部网络&#xff08;如互联…

低视力者出行升级:适配服务助力双手解放与环境感知

作为一名资深记者&#xff0c;我有幸深入了解并记录低视力者在日常出行中所面临的挑战与解决方案。近年来&#xff0c;低视力者辅助设备适配服务提供领域的创新成果&#xff0c;尤其是结合手机应用的辅助设备&#xff0c;正在以人性化、智能化的方式&#xff0c;帮助低视力者实…

网安学习笔记-day13,文件共享暴力破解

文件共享漏洞 准备阶段 配置IP地址 Windows XP 10.1.1.2/24 Windows Server 2003 10.1.1.1/24 开启文件共享 文件共享使用的是445端口&#xff0c;输入命令net share 在XP上打开运行窗口&#xff08;CtrlR&#xff09;输入\\10.1.1.1&#xff0c;出现以下界面则成功开启共享…

1142 - SELECT command denied to user ···

MySql子账户操作数据库权限不够&#xff0c;提示错误 1142 - SELECT command denied to user database 1142 - ALTER command denied to user database 以下命令可以解决 GRANT SELEC your_database_name TO mysql_account%;

块存储、文件存储、对象存储概念与区别

1. 块存储 块存储是将数据切分成固定大小的块&#xff0c;然后将这些块存储在物理设备&#xff08;如硬盘、固态硬盘&#xff09;上。每个块都有唯一的标识符&#xff0c;并且可以独立地被读取、写入或删除。块存储通常用于存储文件系统&#xff0c;例如操作系统的文件系统&am…