【C++】priority_queue使用和模拟实现——仿函数(上)

简介: 【C++】priority_queue使用和模拟实现——仿函数(上)

首先,在这里还是推荐一下我正在用的一个C++的查询文档网站,这里是关于 priority_queue的使用文档。有什么本文中没有讲清楚的东西,可以去参考这个网站的内容。


1. priority_queue的使用


1.priority_queue的介绍

priority_queue(优先级队列),是包含在<queue>头文件下的一个容器适配器。下面是cplusplus网站对priority_queue的介绍。

7bcb7265363c98ba90a921e807f9535d.png

可以看到,priority_queue是一个容器适配器,默认的容器是vector。他和队列在使用上是类似的,只是出队列的规则不同,queue是按照入队列的顺序出队列,priority_queue是按照优先级出队列,这里的优先级是按照类模板的第三个参数决定的,这里的第三个参数是一个仿函数,关于仿函数的概念将会在下文中详细讲解。


2.priority_queue的结构

priority_queue在底层的逻辑上,是一个堆,每次pop的都是堆定的数据,关于堆的讲解,可以去看一下博主之前写的【数据结构】树与二叉树,里面对堆这个数据结构讲解的还是比较清楚的。


3. 主要接口

priority_queue是一个容器适配器,所以接口基本上都差不多,我们看一下文档:

5da7c69efcb04bc19577e52cab55f691.png

可以看到,接口和stack、queue基本相同,这里给出几个重点的函数接口:

函数接口 接口说明
priority_queue() 构造一个空的优先级队列
priority_queue(first, last) 按照迭代器区间构造一个优先级队列
empty() 判断优先级队列是否为空,返回bool类型
top() 返回堆顶元素(被cosnt修饰)
push(x) 插入一个数据
pop() 删除堆顶数据


4. 使用示例

了解了上述的一些接口之后,总是要实践一下的,接下来我们使用以下这个结构,来测试一下:

//这里放一下测试代码,读者可以自行拷贝下去测试
void Test1()
{
  priority_queue<int> heap;
  heap.push(5);
  heap.push(3);
  heap.push(7);
  heap.push(10);
  heap.push(1);
  heap.push(9);
  while (!heap.empty())
  {
    cout << heap.top() << " ";
    heap.pop();
  }
  cout << endl;
}


257cc0e248664ea35cc3cd78832dce70.png

可以看到,默认情况pop出来的是当前堆内的最大值,所以可知默认的堆是大堆

❓那么如果想让堆变成小堆需要怎么做呢?

✅这里就要注意到,在文章的开头,我们讲到的类模板的第三个参数。可以看到默认传的参数是less,这就是表示默认建立大堆,如果想建小堆的话需要传的仿函数就是greater

9b83ce8a72197846303e01b631235e3a.png

接下来,就用刚学的priority_queue做一道OJ题吧:215. 数组中的第K个最大元素 - 力扣(LeetCode).

我是题解,点我

相关文章
|
2月前
|
C++
C++(十七)仿函数
### Functor 仿函数简介 Functor(仿函数)是一种通过在类中实现 `operator()` 使其行为像函数的对象。这种方式可以让类拥有更多可定制的功能,同时保持函数般的简洁调用方式。下面展示了如何定义和使用一个计算幂运算的仿函数类,并通过示例说明了其在 `std::sort` 中的优势与灵活性。
|
4月前
|
存储 算法 Java
【C++】优先级队列priority_queue模拟实现&&仿函数
【C++】优先级队列priority_queue模拟实现&&仿函数
38 1
|
5月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
52 1
|
4月前
|
存储 算法 C语言
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
【C++】详解STL的适配器容器之一:优先级队列 priority_queue
|
6月前
|
存储 算法 C语言
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)(下)
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)
54 2
|
6月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(上)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
50 1
|
5月前
|
C++
C++函数对象(仿函数)
C++函数对象(仿函数)
|
6月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
27 0
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
|
5月前
|
存储 设计模式 算法
【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?
【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?
54 0
|
6月前
|
算法 C语言 C++
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)(中)
从C语言到C++_19(容器适配器+stack和queue模拟实现+优先级队列priority_queue)
48 0