priority_queue & deque

目录

priority_queue介绍

priority_queue的使用

堆算法

算法:sort

容器适配器

deque的简单介绍

为什么选择deque作为stack和queue的底层默认容器

priority_queue介绍

  • 1.1 priority_queue底层结构就是堆
  • 1.2 模板参数列表:
    • template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> >
    • class priority_queue;
      • priority_queue 默认使用vector来存放元素
      • 堆中元素的比较方式默认是按照小于的方式,按照less(小于)方式比较,大堆
  • 1.3 优先队列被实现为容器适配器,priority_queue将特定容器类(vector)封装作为其底层容器类,再加上堆的算法make_heap、push_heap和pop_heap。
  • 1.4 priority_queue:头文件<queue>

priority_queue的使用

  • 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。
  • priority_queue()/priority_queue(first,last):构造一个空的优先级队列
    • 元素类型为自定义类型时,需要在自定义类型内部重载比较方式
    • 比较方式的传参
    • 函数指针
    • 仿函数
      • 仿函数,也可以将其称为函数对象-->可以像函数调用方式使用的对象,只需在类中能将函数调用运算符即()重载即可
      • 作用:让算法或者类更加的灵活-->通过仿函数来配置算法或者类具体的功能
  • empty( ):检测优先级队列是否为空,是返回true,否则返回false
  • top( ):返回优先级队列中最大(最小元素),即堆顶元素
  • push(x):在优先级队列中插入元素x
  • pop():删除优先级队列中最大(最小)元素,即堆顶元素

堆算法

  • 头文件:<algorithm>
  • make_heap:建堆
  • push_heap:向堆中插入一个元素,并调整成堆(向上调整)
  • pop_heap:将堆顶元素删除,并调整成堆(向下调整)
  • 算法:greater
    • 头文件:<functional>

算法:sort

  • 头文件:<algorithm>
  • sort默认按照less的方式比较--->升序
  • greater的方式比较-->降序

容器适配器

  • 什么是适配器
    • 适配器(配接器)是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
    • STL中:将stack . queue、priority_queue容器适配器
    • list模拟实现中--->实现了一个正向迭代器实现了一个反向迭代器
      • 反向迭代器就是将正向迭代器进行了封装反向迭代器可以将其称为迭代器适配器
  • STL标准库中stack和queue的底层结构
    • STL中stack和queue默认使用deque

deque的简单介绍

  • deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
  • deque底层结构简述:
    • deque:
      • 优点:头插和头删效率高--->0(1),扩容时候效率高
      • 缺陷:代码实现复杂,遍历操作复杂以及效率低
    • deque的迭代器比较复杂
    • deque::begin()和deque::end()
    • deque:特别不适合做遍历操作,因为迭代器每移动一次就需要检测是否在空间的末尾

为什么选择deque作为stack和queue的底层默认容器

  • stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:
  • 对于stack而言:
    • 1.当stack中元素存储到一定程度就需要扩容,deque扩容比vector的扩容效率高---因为deque不需要搬移元素
    • 2.栈不需要遍历,deque的劣势就规避
  • 对于queu而言:
    • 1.如果用list,每个节点还要分配额外的空间来存储prev和next,而deque不需要存储额外的内容
    • 2.deque是分段连续的,缓存效率高
    • 3.队列不需要比遍历,deque的劣势就规避

猜你喜欢

转载自blog.csdn.net/sy2453/article/details/124544899