priority_queue的介绍使用及模拟实现

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;
}

发布了117 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gp1330782530/article/details/105488640