【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).

我是题解,点我

相关文章
|
5月前
|
C++ 容器
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
|
19天前
|
存储 算法 C++
c++的学习之路:17、stack、queue与priority_queue
c++的学习之路:17、stack、queue与priority_queue
31 0
|
2月前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
27 3
|
18天前
|
编译器 C语言 C++
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
|
29天前
|
存储 算法 C++
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
【C++初阶】STL详解(九) priority_queue的使用与模拟实现
21 0
|
2月前
|
存储 算法 C++
C++:stack、queue、priority_queue增删查改模拟实现、deque底层原理
C++:stack、queue、priority_queue增删查改模拟实现、deque底层原理
35 0
|
2月前
|
算法 C++ 容器
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
【C++练级之路】【Lv.10】【STL】priority_queue类和反向迭代器的模拟实现
|
2月前
|
存储 算法 调度
【C/C++ 数据结构 优先队列】了解学习`std::priority_queue`的使用
【C/C++ 数据结构 优先队列】了解学习`std::priority_queue`的使用
44 3
|
2月前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
3月前
|
算法 C语言 C++
C++:priority_queue模拟实现
C++:priority_queue模拟实现
22 0