stack和queue

stack****的介绍

  1. stack 是一种容器适配器,专门用在具有后进先出操作的上下文环境中,只能从容器的一端进行元素的插入与提取操作。
  2. stack 是作为容器适配器被实现的,容器适配器是对特定类封装,并提供一组特定的成员函数来访问,将特定类作为其底层,元素在特定容器的尾部( 即栈顶 ) 被压入和弹出。
  3. stack 的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些底层容器类应该支持以下操作:
    empty :判空操作
    back :获取尾部元素操作
    push_back :尾部插入元素操作
    pop_back :尾部删除元素操作
  4. 标准容器 vector 、 deque 、 list 均符合这些需求,默认情况下,如果没有为 stack 指定特定的底层容器, 默认情况下使用deque 。

stack****的使用

stack的定义


第一个模板参数是元素的类型,第二个模板参数是底层容器类型,默认deque

construct

stack的默认构造函数有一个缺省参数,就是底层容器对象

empty


判断stack是否为空

size


返回stack里面的元素个数

top


返回栈顶元素的引用

push


在栈顶添加元素

pop


删除栈顶元素

queue****的介绍

  1. 队列是一种容器适配器,专门用于在 FIFO上下文(先进先出) 中操作,其中从容器一端插入元素,另一端提取元素。
  2. 队列作为容器适配器实现,容器适配器就是将特定容器类封装作为其底层容器类, queue 提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    empty :检测队列是否为空
    size :返回队列中有效元素的个数
    front :返回队头元素的引用
    back :返回队尾元素的引用
    push_back :在队列尾部入队列
    pop_front :在队列头部出队列
  4. 标准容器类 deque 和 list 满足了这些要求。默认情况下,如果没有为 queue 实例化指定容器类,则使用标准容器deque 。

queue****的使用

queue的定义

第一个模板参数是元素类型,第二个模板参数是底层容器类型,默认deque

constructor

默认构造函数只有一个缺省参数,是底层容器对象

empty


判断queue是否为空

size


返回queue里面的元素个数

front


返回第一个元素的引用

back


返回最后一个元素的引用

push


在队列后面添加元素

pop


删除队列头部的元素

priority_queue****的介绍

  1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的或最小的。
  2. 此类的上下文类似于堆,在堆中可以随时插入元素,并且只能检索堆顶元素 ( 优先队列中位于顶部的元素) 。
  3. 优先队列被实现为容器适配器,容器适配器就是将特定容器类封装作为其底层容器类,priority_ queue 提供一组特定的成员函数来访问其元素。
  4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层容器类应该可以通过随机迭代器访问,并支持以下操作:
    empty() :检测容器是否为空
    size() :返回容器中有效元素个数
    front() :返回容器中第一个元素的引用
    push_back() :在容器尾部插入元素
    pop_back() :删除容器尾部元素
  5. 标准容器类 vector 和 deque 满足这些需求,因为list是双向迭代器,不支持随机迭代器所以被pass。默认情况下,如果没有为 priority_queue 类实例化指定底层容器类,则使用vector 。
  6. 底层容器 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、 push_heap 和 pop_heap 来自动完成此操作。

priority_queue****的使用

优先级队列默认使用 vector 作为其底层存储数据的容器,在 vector 上又使用了堆算法将 vector 中元素构造成 堆的结构,因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue 。注意: 默认情况下 priority_queue 是大根堆

priority_queue的定义


第一个模板参数是元素类型,第二个模板参数是底层容器类型,第三个模板参数是一个仿函数类型,operator()重载是子节点与父节点应该满足的比较规则,比如less底层就是重载operator()进行小于号比较,其实就是子节点应该小于父节点,该种比较规则下建的堆是大堆

constructor


第一个参数是比较规则类对象,第二个参数是底层容器类对象

empty


判断堆是否为空

size


返回堆里面的元素个数

top


返回堆顶元素的引用

push


在堆中添加该元素

pop


删除堆顶元素

priority_queue模拟

priority_queue模拟
这个堆模拟中并没有建堆的过程,而是每次插入一个元素然后调整,向上调整的时间复杂度是logn。
如果我当前有n个元素,那么将这些数据建成堆的时间复杂度应该是O(n)

容器适配器

什么是适配器

适配器是一种设计模式 ( 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结) , 该种模式是将一个类的接口转换成客户希望的另外一个接口

STL标准库中stackqueue****的底层结构

虽然 stack 和 queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为 容器适配 ,这是因为 stack 和队列只是对其他容器的接口进行了包装, STL 中 stack 和 queue 默认使用 deque ,比如:

相关推荐
火山引擎开发者社区1 小时前
Vector Bucket:云原生向量存储新范式
人工智能·机器学习·云原生
KubeSphere 云原生1 小时前
云原生周刊:K8s 成为人工智能的新动力引擎
人工智能·云原生·kubernetes
会飞的小蛮猪2 小时前
Rockylinux急速安装K8s学习环境
学习·容器·kubernetes
❀͜͡傀儡师2 小时前
Docker 部署 Grafana + Loki + Promtail 日志可视化搭建
docker·容器·grafana
wangmengxxw2 小时前
微服务-服务容错(续)
微服务·云原生·架构·服务容错
不是笨小孩i2 小时前
多元算力融合实践:openEuler在中等配置硬件环境下的性能验证
云原生·serverless
星哥说事2 小时前
存储:PV / PVC / StorageClass 动态存储供给(K8s 存储核心篇)
云原生·容器·kubernetes
xiejava10182 小时前
企业级私有docker镜像仓库Harbor的搭建和使用
运维·docker·云原生·容器