priority_queue的介绍使用及模拟实现
1、priority_queue的介绍
1、优先队列是一种容器适配器,它的特点是第一个元素总是最大或者最小的
2、优先队列提供的操作有判空、返回堆顶、尾插、尾删
3、优先队列可以看做是大根堆,小根堆
4、优先队列默认使用vector作为其底层
5、优先队列需要支持随机访问迭代器,以便始终在内部保持堆结构,容器适配器通过在需要时自动调用算法函数make_heap/push_heap/pop_heap来自动完成此操作
2、priority_queue的使用
函数声明 | 接口说明 |
---|---|
priority_queue()\priority_queue(first,last) | 构造一个空的优先级队列 |
empty( ) | 检测优先级队列是否为空,是返回true,否则返回false |
top( ) | 返回优先级队列中最大(最小元素),即堆顶元素 |
push(x) | 在优先级队列中插入元素x |
pop() | 删除优先级队列中最大(最小)元素,即堆顶元素 |
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
int main()
{
vector<int> v{ 3, 2, 4, 5, 6, 1, 7, 8, 9 };
priority_queue<int> pq;
for (auto& e : v)
{
cout << e << " ";
}
cout << endl;
for (auto& e : v)
{
pq.push(e);
}
cout << pq.top() << endl;
system("pause");
return 0;
}
3、priority_queue的模拟实现
priority_queue.h
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
namespace gwp
{
template<class T, class Sequence = vector<T>, class Compare = less<T>>
class priority_queue
{
public:
priority_queue()
:m_c()
{
}
template<class InputIterator>
priority_queue(InputIterator first, InputIterator last)
: m_c(first, last)
{
make_heap(m_c.begin(), m_c.end(), m_cmp);
}
bool empty()
{
return m_c.empty();
}
size_t size()
{
return m_c.size();
}
T& top()
{
return m_c.front();
}
const T& top() const
{
return m_c.front();
}
void push(const T& x)
{
m_c.push_back(x);
push_heap(m_c.begin(), m_c.end(), m_cmp);
}
void pop()
{
pop_heap(m_c.begin(), m_c.end(), m_cmp);
m_c.pop_back();
}
private:
Sequence m_c;
Compare m_cmp;
};
}
priority_queue.cpp
#include <iostream>
#include "priority_queue.h"
using namespace std;
int main()
{
vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
gwp::priority_queue<int> pq;
for (auto& e : v)
{
pq.push(e);
}
cout << pq.empty() << endl;
cout << pq.size() << endl;
cout << pq.top() << endl;
pq.pop();
cout << pq.top() << endl;
system("pause");
return 0;
}