STL简介以及STL中的容器

2023-05-16

我认为STL(标准模板库)就是对常见数据结构和算法的再封装,以便开发者能更加灵活的使用数据结构和常用算法
通常认为,STL由容器、算法、迭代器、函数对象、适配器、内存分配器 这 6 部分构成

容器

简单理解容器,他就是封装数据结构的模板类
STL中的容器分为三大类,分别是:序列容器、关联容器(排序容器) 以及 无序关联式容器(哈希容器)
注意两点: 1. 容器的分类直接决定了容器内元素的存储方式。序列容器中的元素顺序由数据进入容器的位置决定;排序容器中元素的位置由元素键值的大小决定;而哈希容器元素的位置是由元素的哈希值决定。
2.因容器的存储方式不同,所以使用不同的容器进行相同的操作,所需要的开销完全不同,因此在使用容器之前应当对使用何类型的容器进行充分考虑

序列容器

序列容器主要包括:array数组容器、 vector向量容器、list列表容器、deque双端队列容器 以及 forward_list 列表容器
在五个序列容器中,array容器 和 vector容器 是以数组实现的。不同的是 array 是对普通数组进行的封装,而 vector 是对动态数组进行的封装。这就导致了 array 是不可变长,而 vector 是可变内存长度的数组。
list容器 和 forward_list容器 是以链表的形式实现的。不同的是 list 是双链链表实现,而 forward_list 是单链链表实现的。因此在选用时应优先选择 forward_list列表容器
deque双端队列容器,可以理解为双向队列,能快速的在队列两端进行添加、删除操作。因此当需要频繁在数列前后添加或删除元素时优先考虑 deque 容器。

序列容器主要供选择就两个 vector 以及 list。array勉强算是吧
说一下 list 与 vecto 的不同
1. list 可以使用 sort 对容器内的元素进行排序。而 vector 默认不支持排序
2. list 没有 at 函数,也未重载操作符 []
3. list的内置迭代器无法进行 + 运算。 stl_list.begin() + 3 是错的
vector 与 list 的选取一般情况下相差并不大,但需要进行排序操作时选择list,对空间要求比较高时选择vector

关联容器

排序容器 | 关联式容器 以键值对的形式保存数据。因此关联式容器在查找、访问、插入和删除指定元素的效率会高一些。
哈希容器 | 无序关联式容器 也是以键值对的形式保存数据。但哈希容器不会以键值对容器内的元素进行排序,也因此无序关联式容器在查找指定元素时会有更高的效率,遍历却极为不足。
造成关联式容器 和 无序容器 差异的原因是两者在底层的实现。关联容器底层采用红黑树结构进行存储,而无序容器底层采用的是哈希表的存储结构。由此也就导致了无序容器具有更高的查找效率。
STL中关联式容器主要包括: map、multimap、set 以及 multiset 这4种。
关于这四个关联式容器其实很好理解:
因为关联式容器是以键值对的形式存储数据,所以 键 和 值 的关系就直接决定了这四个容器的构造。 是否允许创建 相同的 “键”, 允许使用 multixxx ,不允许不使用 multi。键值是否保持一致,键值保持一致使用set容器,键值不必保持一致就使用 map容器
无序关联式容器,在所有的关联式容器的基础上加上 unorder_ 前缀,就构成了无序关联式容器。所以无序关联容器在使用上和关联式容器只有细微的差别。在选择上如果如果涉及大量遍历操作优先使用无序关联容器即可。

(容器)适配器

所谓的容器适配器就是在容器的基础上进行的再封装,以使其满足某些特定场景的需求
STL中容器适配器有三个,分别是:stack、queue 和 priority_queue。
stack – 栈 – 先进后出
queue – 队列 – 先进先出
priority_queue – 排序队列 – 权重大的先出

容器适配器必须要清楚以下几点:

  1. 容器适配器是为了满足某一特定的场景进行设计的。
    这特定的场景也就和适配器的名字一样 stack–实现栈操作 queue–实现队列操作
  2. 容器适配器没有内置迭代器,因此要对容器适配器进行遍历就需要逐个移除
  3. 容器适配器是由 序列容器 进行再封装的,因此构建容器适配器的对象一定是一个序列容器
  4. 在容器适配器中使用的容器必须是满足一定条件的(实现相应方法的实现,不必探究)只需要知道stack 只能由vector、deque、list进行构建, queue 只能由 deque、list进行构建 priority_queue只能由deque、vector进行构建。
priority_queue队列默认的入队顺序          
priority_queue 队列创建时,默认指定std::less<T>入队(最大的元素排在队列头,其他元素位置与插入顺序有关。)            
入队元素:3,1,2,6,4,5,priority_queue的入队顺序是               
首先: 3入队, 1,2入队比3小,所以1,2排在3后边(只找最大的,所以1,2不排序)              
3  1  2         
然后:6入队比3大,所以6排在对列头       
6 3 1 2
之后:4,5都没6大排在队列尾
6 3 1 2 4 5
出队: 最大的出队后剩余选出最大的放在队列头
5 3 1 2 4
4 3 1 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL简介以及STL中的容器 的相关文章

  • Python3 下 ROS 的使用 cv_bridge

    Python 3 下 ROSmsg 转 cv2 项目中用到的 Tensorflow2 4 的环境 xff0c 该环境只支持python3 版本 xff0c 项目中遇到不少需要和 ROS 交互的地方 xff0c 所以不断探索 python3
  • 深度图和RGB图对齐

    深度图 canny RGB canny Alignment xff1a code span class token function import span cv2 span class token function import span
  • 认识romfs文件系统

    1 1 什么是romfs romfs 是一个只读文件系统 xff0c 主要用在 mainly for initial RAM disks of installation disks 使用romfs 文件系统可以构造出一个最小的内核 xff0
  • Livox Lidar 特征提取方式总结

    传统的 旋转式雷达 xff0c 激光固定在雷达的旋转部件上 xff0c 依靠转子的转动而获得360的旋转视野 xff0c 由于旋转部件的存在 xff0c 为了获得更加精准的数据 xff0c 需要跟多的人工校准和更复杂的设计 xff0c 也因
  • C++ 菜鸟之路 (四) boost::thread 多线程全解析

    boost thread 的一般用法 boost thread的几个函数 锁 lock 函数多线程函数的限制 官方解释 xff1a http www cplusplus com reference thread thread joinabl
  • ROS 之 advertise 详解

    在学习过程中接触到如下的一段话 span class hljs comment ROS handles span ros span class hljs tag NodeHandle span node tf span class hljs
  • Linux 下 openMP 效率并未提升的解决方案

    OpenMP 正确观察计算时间OpenMP 经验总结 xff08 1 xff09 openmp 线程使用范围 xff08 2 xff09 openmp 多层嵌套的问题 OpenMP 正确观察计算时间 在使用 openmp的过程中 xff0c
  • C++ Yaml文件解析安装及使用 yaml-cpp

    C 43 43 Yaml文件解析安装及使用 安装 yaml cpp克隆官方库编译 yaml cpp 示例代码robot cpprobot yaml编译 robot cpp运行结果 难点分析与总结什么是 a 与 so 文件静态链接库 a 与动
  • 点云数据格式解析 sensor_msgs::PointCloud2

    在使用多线激光的时候需要总是会碰到点云数据 xff0c 这里简单的接受一下点云数据 xff0c 并堆数据结构进行分析 xff0c 方便自己后期对点云特征数据进行处理 文章目录 Rviz中的点云数据点云数据结构分析点云数据 python 解析
  • Arduino 读取GPS 数据发送解析并发布ROS topic(二)

    Arduino 读取GPS 数据发送解析并发布ROS topic 一 https blog csdn net Fourier Legend article details 84107494 概述 本部分将主要讲将串口接受到的数据 xff0c
  • LOAM进行点云地图创建

    3D激光点云数据处理入门 xff08 一 xff09 使用LOAM进行点云地图创建 LOAM 原理简述topic关系算法分析算法伪代码 LOAM 建图实践创建你的 ROS Workspace下载LOAM Package下载数据包运行 LOA
  • ROS - teb_local_planner 参数总结

    参考官方教程 http wiki ros org teb local planner Tutorials 全英文看着有点累 在此总结一下调试的过程和小小的经验 安装 teb local planner sudo apt get instal
  • 路径规划算法(2) - A*寻路算法 python实现及解析

    代码 span class token comment coding 61 utf 8 span span class token keyword import span math span class token comment 启发距离
  • 使用FSMC驱动LCD以及数据线偏移的问题

    FSMC的理解 使用FSMC功能将8080接口的LCD当外部RAM来使用 xff08 数据传给LCD时没经过内部SRAM xff0c 所以一帧图片很大也可以直接传 xff09 xff0c 根据STM的地址分配图可以看出外部RAM的地址由0x
  • C++调用HTTP实现方式

    转自 xff1a http blog 163 com lyz sea blog static 11558670720118245052189 Http访问有两种方式 xff0c GET和POST xff0c 就编程来说GET方式相对简单点
  • 跟我学c++中级篇——STL智能指针再述

    一 智能指针 xff08 smart pointer xff09 在前面的文章分析中对智能指针分析的还是比较多的 xff0c 这里把一具体的遗漏以及一些新的感悟再总结一下 xff0c 以之为鉴 什么是智能指针 xff1f 在C C 43 4
  • 从CAN到CANOpen——准入门大全(二)

    第二节 关于CAN ID xff1a 一个标准帧的ID共11位 xff0c 一个扩展帧的ID共29位 扩展帧的ID分11位和18位的两段 xff0c 如下图所示 RTR显性 xff1a 数据帧 xff1b 隐性 xff1a 远程帧 SRR隐
  • vscode使用clang-format格式化C++代码

    1 安装c c 43 43 插件 2 在首选项 设置中搜索format xff0c 设置Editor Default Formatter为ms vscode cpptools 3 在扩展C C 43 43 中设置 Clang format
  • EC20 GPS RMC格式数据转化

    文章目录 目录 前言 一 RMC是什么 xff1f 二 EC20 输出的RMC解析 1 EC20返回的RMC报文 2 RMC报文解析 3 NMEA数据ddmm mmmm转换成dd ddddd 4 RMC UTC时间转化成北京时间 总结 前言
  • C++ 第三方常用网络库

    From xff1a https www cnblogs com aitantianderuangutou p 11416902 html 1 ACE 庞大 复杂 xff0c 适合大型项目 开源 免费 xff0c 不依赖第三方库 xff0c

随机推荐

  • Postman 使用方法详解

    From xff1a https zhuanlan zhihu com p 534078123 Postman V9 16 绿色版汉化 xff1a https www cr173 com soft 1497202 html Postman是
  • 串口波形分析

    本文使用逻辑分析仪 xff0c 抓取串口波形 xff0c 进而分析串口数据 串口配置为115200波特率 xff0c 8个数据位 xff0c 1个停止位 xff0c 无校验方式 字符1的波形如下图 xff1a 从图中可以看到8个数据位 xf
  • 电影资源 BT PT下载的电影命名 规则 资源 详解

    初识 一般来说 xff0c 正规压制组压制的电影 xff0c 都采用 0day 命名方式 xff0c 即 xff1a 英文名称 版本说明 年份 片源 分辨率 视频编码 音频格式 压制小组 例如文件名 xff1a Jumanji The Ne
  • 对于51单片机的RAM内存分配(包含栈的分配)

    对于51单片机的RAM内存分配 xff08 包含栈的分配 xff09 我使用的是SH79F3283 xff0c 内部RAM有256字节 xff0c 由常规寄存器 静态存储区和堆栈组成的 xff0c 创建一个新的程序默认占用9个字节RAM x
  • 忘记windows密码解决办法(用户密码或SYSKEY)

    64 TOC 还有朋友问第一层的BIOS密码怎么解 xff1a 拔电池就能解 xff0c 断电 xff0c 打开电脑主板 xff0c 找到一个纽扣电池 xff0c 拔掉 xff0c 长按电源键 xff0c 再插电 xff0c 第一层就没了
  • 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树 Huffman Tree 以及哈夫曼编码的构造原理 方法 xff0c 并用代码实现 1哈夫曼树基本概念 路径 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度 两结点间路径上的分支数 树的路径长
  • Makefile命令参数、调用其他Makefile、嵌套

    更多单片机 嵌入式内容及参考资料 xff1a 大叔的嵌入式小站 xff1a Makefile学习 3 make命令参数 调用其他makefile 嵌套 一 Make命令运行参数 参数 参数的作用 C dir读入指定目录下的makefile
  • ARM学习-ARM指令集详解

    目录 1 ARM 存储器访问指令 1 1 LDR 和STR 加载 存储字和无符号字节指令 1 2 LDM和STM 批量加载 存储指令 1 3 SWP 寄存器和存储器交换指令 2 ARM 数据处理指令 2 1数据传送指令 2 1 1 MOV
  • IIC(I2C)协议详解

    1 简介 IIC 即I C xff0c 全称 Inter Integrated Circuit xff0c 字面上的意思是集成电路之间 xff0c 它其实是I C Bus简称 xff0c 所以中文应该叫 集成电路总线 xff0c 它是一种串
  • STM32F4+FreeRTOS+LVGL实现嵌入式快速开发(缝合怪)

    极速进行项目开发 xff0c 只需要懂一款芯片架构 43 一个操作系统 43 一个GUI 各种部件程序全靠抄 xff0c 成为究极缝合怪 本文用stm32f407 43 FreeRTOS 43 lvgl演示一些demo 原文链接 xff1a
  • 彻底弄清FreeRTOS中的事件组(Event Groups)

    之前已经学过两个任务之间可以利用信号量 队列来通信 xff0c 任务可以利用这两个机制等待某一个事件发生 xff0c 但是假如需要等待多个事件发生呢 xff1f 这就需要用到事件组了 事件组可以让任务进入阻塞态 xff0c 等待一个或多个事
  • 彻底掌握FreeRTOS中的务通知(Task Notifications)

    在之前的文章中已经讲解了很多种用于任务件通信的机制 xff0c 包括队列 事件组和各种不同类型的信号量 使用这些机制都需要创建一个通信对象 事件和数据不会直接发送到接收任务或接收ISR xff0c 而是发送到通信对象 xff08 也就是发送
  • 一文彻底分清ARM架构、内核、指令集等相关概念

    任何学习嵌入式 单片机的朋友都绕不开ARM xff0c 但初学者总是对ARM架构 内核 指令集等相关概念不够清晰或者混淆 xff0c 本文帮助入门的朋友彻底弄清楚 目录 1 芯片 CPU SOC 2 ARM公司 3 ARM架构与内核 指令集
  • 三款常用IP发包工具介绍

    AntPower 版权所有 2003 技术文章 http www antpower org 第1 页共14 页 AntPower xff0d 技术文章 三款常用IP 发包工具介绍 小蚁雄心成员郎国军著 lgj 64 qingdao cngb
  • vscode查看不了函数列表(亲身经历)

    方法一 xff1a ctrl 43 shift 43 o 方法二 xff1a ctrl 43 B 查看左边的大纲 重点 xff1a 当处于受限模式时 xff0c 是查看不了的 xff0c 需要信任窗口才可以 点击管理 点击信任
  • 带你清晰了解#define和宏

    文章目录 define的简单使用 define的原理 define定义宏 define的替换规则 和 define的简单使用 语法 xff1a define name stuff 对于 define的基本语法理解起来其实并不困难 xff0c
  • 玩转Jetson Nano(三):安装Pytorch GPU版

    玩转Jetson Nano xff08 三 xff09 xff1a 安装Pytorch GPU版 前言安装Pytorch GPU版查看CUDA版本号下载Pytorch对应的wheel文件测试是否安装成功常见问题OSError libmpi
  • 可随身携带的工业无人机?! ZR-M66六旋翼多镜头倾斜摄影无人飞行系统

    更多无人机测绘资讯 xff0c 关注 三维前沿 ZR M66六旋翼多镜头倾斜摄影无人飞行系统 xff0c 集合了领先于行业内的多种设计方式 xff0c 具备模块化设计 高效作业 安全可靠 直观作业管理四大核心优势 xff0c 摆脱传统测绘作
  • PLC寻址应注意的问题

    L MD100 LAR1 与 L MD100 LAR1 有什么区别 xff1f 当将MD100以这种 MD100 形式表示时 xff0c 你既要在对MD100赋值时考虑到所赋的值是否符合存储器间接寻址双字指针的规范 xff0c 又要在使用这
  • STL简介以及STL中的容器

    我认为STL 标准模板库 就是对常见数据结构和算法的再封装 xff0c 以便开发者能更加灵活的使用数据结构和常用算法 通常认为 xff0c STL由容器 算法 迭代器 函数对象 适配器 内存分配器 这 6 部分构成 容器 简单理解容器 xf