C++——stack|queque|容器适配器 栈的实现 queque实现 dequequedequeque的缺陷 优先级队列习题 优先级队列模拟实现 仿函数(二)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 笔记

优先级队列


priority_queque

1.png

优先级队列的底层是堆(二叉树的堆)

2.png3.png

第二个参数容器适配器,第三个参数仿函数,less是大的优先级高


后面俩个参数给缺省值,测试优先级队列,默认大的优先级高

4.png

也可以用一个区间去初始化

5.png

把第三个参数改为greater,就是小的优先级高

6.png



习题  

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int>  pq(nums.begin(),nums.end());
       while(--k)
       {
           pq.pop();
       }
       return pq.top();
    }
};

215. 数组中的第K个最大元素 - 力扣(LeetCode)


优先级队列模拟实现


namespace myspace
{
  //大堆
  template<class T,class Container=vector<T>>
  class priority_queque
  {
  public:
  template<class InputerIterator>
  priority_queque(InputerIterator first, InputerIterator last)//迭代器区间
  {
    while (first < last)
    {
    _con.push_back(*first);
    ++first;
    }
    //建堆
    for (int i = (_con.size() - 1 - 1)/2;i>=0;--i)
    {
    adjust_down(i);
     }
  }priority_queque()//默认构造,不然会报错,因为上面的迭代器区间这个函数跟构造函数同名
  {}
  void adjust_up(size_t child)
  {
    size_t parent = (child - 1) / 2;
    while (child>0)
    {
    if (_con[parent] < _con[child])
    {
      std::swap(_con[parent], _con[child]);
      child = parent;
      parent = (child - 1) / 2;
    }
    else
    {
      break;
    }
    }
  }
  void adjust_down(size_t parent)
  {
    size_t child = parent * 2 + 1;
    while (child < _con.size())
    {
    if (child + 1 < _con.size() && _con[child + 1] > _con[child])
    {
      ++child;
    } //选出最大的孩子
    if (_con[child] > _con[parent])
    {
      std::swap(_con[child],_con[parent]);
      parent = child;
      child = parent * 2 + 1;
    }
    else
    {
      break;
    }
    }
  }
  void push(const T& x)//(大堆)堆的插入
  {
    _con.push_back(x);
    adjust_up(_con.size()-1);//尾插后向上跳转
  }
  void pop()//删除堆顶数据
  {
    std::swap(_con[0], _con[_con.size() - 1]);
    _con.pop_back();
    adjust_down(0);
  }//对顶数据和最后一个数据交换,之后删除最后一个数据,然后向下调整堆
  const T& top()
  {
    return _con[0];
  }
  bool empty()
  {
    return _con.empty();
  }
  size_t size()const
  {
    return _con.size();
  }
  private:
  Container _con;
  };
}
int main()
{
  int a[]= { 156,132,156,156,31,5,15,31,364,15 };
  myspace::priority_queque<int> pq(a,a+sizeof(a)/sizeof(int));
  while (!pq.empty())
  {
  cout << pq.top() << " ";
  pq.pop();
  }
  return 0;
}

7.png


优先级队列要控制比较大小的逻辑,上面的写法我们以大堆为例但是这样把优先级队列给写死了,如果把里面的>改为<则会变成小堆,但是这样比较麻烦。上面我们只传了俩个参数,还有一个参数没传,第三个参数是仿函数


仿函数

仿函数/函数对象——是个类,重载的是operator(),类对象可以像函数一样去使用,本质就是重载


()也是一个运算符

8.png

跟sort不同,sort传的是函数模板,传的是对象,而这里传的是类模板 ,传的是类型

9.png


这里的lsFunc不是函数名 ,而是一个类对象


这俩个等价

10.png

不仅有less,还有greater


namespace myspace
{
  template<class T>
  class less
  {
  public:
  bool operator()(const T& l, const T& r)const
  {
    return l < r;
  }
  };
  template<class T>
  class greater
  {
  public:
  bool operator()(const T& l, const T& r)const
  {
    return l > r;
  }
  };
}

11.png

我们将这里全部改成小于号

12.png


传入仿函数

13.png



这样就可以去替换小于号

14.png

小堆

16.png

大堆

15.png

完整代码


namespace myspace
{
  //大堆
  template<class T,class Container=vector<T>,class Compare=less<T>>
  class priority_queque
  {
  public:
  template<class InputerIterator>
  priority_queque(InputerIterator first, InputerIterator last)//迭代器区间
  {
    while (first < last)
    {
    _con.push_back(*first);
    ++first;
    }
相关文章
|
30天前
|
C++
使用C++代码实现栈
使用C++代码实现栈
|
1月前
|
存储 程序员 C++
在C++语言中容器的适配器
在C++语言中容器的适配器
15 0
|
1月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
存储 消息中间件 调度
【C++】容器篇(三)—— stack的基本介绍及其模拟实现
【C++】容器篇(三)—— stack的基本介绍及其模拟实现
|
22天前
|
存储 设计模式 算法
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
52 0
|
27天前
|
存储 程序员 编译器
【C/C++ 堆栈以及虚拟内存分段 】C/C++内存分布/管理:代码区、数据区、堆区、栈区和常量区的探索
【C/C++ 堆栈以及虚拟内存分段 】C/C++内存分布/管理:代码区、数据区、堆区、栈区和常量区的探索
27 0
|
2月前
|
存储 设计模式 程序员
C++:stack & queue - 容器适配器
C++:stack & queue - 容器适配器
14 0
|
2月前
|
存储 前端开发 C++
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)
在C++中​​std::stack​​​是一个模板类,它是基于容器的适配器,用于实现堆栈数据结构。堆栈是一种后进先出(LIFO)的数据结构,类似于现实生活中的一叠盘子。
27 4
|
3月前
|
Rust
2023年博客之星入围选拔重装开启——今年没有拉票环节啦
2023年博客之星入围选拔重装开启——今年没有拉票环节啦
30 0
2023年博客之星入围选拔重装开启——今年没有拉票环节啦
|
3月前
|
C++ Python Java
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
17 0
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值