📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:C++学习
🎯长路漫漫浩浩,万事皆有期待
上一篇博客:【C++】STL详解(七)—— stack和queue的使用及模拟实现
文章目录
priority_queue的使用
priority_queue的介绍
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的地方,都可以考虑使用priority_queue。
注意
: 默认情况下priority_queue是大堆。
priority_queue的定义方式
方式一: 使用vector作为底层容器,内部构造大堆结构。
priority_queue<int, vector<int>, less<int>> q1;
方式二: 使用vector作为底层容器,内部构造小堆结构。
priority_queue<int, vector<int>, greater<int>> q2;
方式三: 不指定底层容器和内部需要构造的堆结构。
priority_queue<int> q;
注意
: 此时默认使用vector作为底层容器,内部默认构造大堆结构。
priority_queue各个接口的使用
priority_queue的各个成员函数及其功能如下:
成员函数 | 功能 |
---|---|
push | 插入元素到队尾(并排序) |
pop | 弹出队头元素(堆顶元素) |
top | 访问队头元素(堆顶元素) |
size | 获取队列中有效元素个数 |
empty | 判断队列是否为空 |
swap | 交换两个队列的内容 |
示例:
#include <iostream>
#include <functional>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> q;
q.push(3);
q.push(6);
q.push(0);
q.push(2);
q.push(9);
q.push(8);
q.push(1);
while (!q.empty())
{
cout << q.top() << " ";
q.pop();
}
cout << endl; //9 8 6 3 2 1 0
return 0;
}
仿函数
仿函数/函数对象也是类,是一个类对象。类对象可以像函数一样使用。仿函数要重载operator(),我们通过代码来看一看仿函数:
namespace sherry
{
template <class T>
class less
{
public:
bool operator()(const T& x, const T& y)const
{
return x < y;
}
};
template <class T>
class greater
{
public:
bool operator()(const T& x, const T& y)const
{
return x > y;
}
};
}
int main()
{
sherry::less<int> lessFunc;
lessFunc(1, 2);
lessFunc.operator()(1, 2);
return 0;
}
//lessFunc是一个对象,仿函数对象,可以像函数一样使用
仿函数的作用在于:在C语言中我们通过传入函数指针解决升序降序问题,虽然C++兼容了C,但是C++并没有继续利用函数指针,而是通过仿函数来控制升序和降序,我们以之前写过的排序为例子,通过利用仿函数来实现升序和降序:
template<class T,class Compare>
void BubbleSort(T* a, int n, Compare com)
{
for (int j = 0;<