iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中priority_queue的使用与模拟实现
  • 217
分享到

C++中priority_queue的使用与模拟实现

2024-04-02 19:04:59 217人浏览 安东尼
摘要

目录priority_queue的使用priority_queue简介priority_queue的使用priority_queue的模拟实现priority_queue的使用 pr

priority_queue的使用

priority_queue文档介绍

priority_queue简介

  • 优先队列是一种容器适配器,有严格的排序标准,它的第一个元素总是它所包含的元素中最大的(或最小的)。
  • 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆(或 最小堆)元素(优先队列中位于顶部的元素)。
  • 默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。

priority_queue的使用

成员函数功能
push插入数据
pop删除优先级队列中最大(最小)元素,即堆顶元素
top返回优先级队列中最大(最小)元素,即堆顶元素
empty检测优先级队列是否为空
size获取队列中有效元素个数
void TestPriorityQueue()
{
	// 默认情况下,创建的是大堆,其底层按照小于号比较
	vector<int> v{ 3, 2, 7, 6, 0, 4, 1, 9, 8, 5 };
	priority_queue<int> q1;// 构建优先级队列
	for (auto e : v)
		q1.push(e);//尾插
	cout << "q1中元素个数:" << q1.size() << endl;
	for (size_t i = 0;i<v.size();++i)
	{
		cout << q1.top() << " ";//输出栈顶的数据
		q1.pop();//尾删
	}
	cout << endl;
	cout << "q1中元素个数:" << q1.size() << endl;
	cout << endl;
	// 如果要创建小堆,将第三个模板参数换成greater比较方式
	priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
	for (size_t i = 0; i<v.size(); ++i)
	{
		cout << q2.top() << " ";//输出栈顶的数据
		q2.pop();//尾删
	}
	cout << endl;
}

在这里插入图片描述

如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载。

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
	bool operator<(const Date& d)const
	{
		return (_year < d._year) ||
			(_year == d._year && _month < d._month) ||
			(_year == d._year && _month == d._month && _day < d._day);
	}
	bool operator>(const Date& d)const
	{
		return (_year > d._year) ||
			(_year == d._year && _month > d._month) ||
			(_year == d._year && _month == d._month && _day > d._day);
	}
	friend ostream& operator<<(ostream& _cout, const Date& d)
	{
		_cout << d._year << "-" << d._month << "-" << d._day;
		return _cout;
	}
private:
	int _year;
	int _month;
	int _day;
};
void TestPriorityQueue()
{
	// 大堆,需要用户在自定义类型中提供<的重载
	priority_queue<Date> q1;
	q1.push(Date(2022, 1, 7));
	q1.push(Date(2022, 1, 1));
	q1.push(Date(2022, 1, 31));
	cout << q1.top() << endl;
	cout << endl;
	// 如果要创建小堆,需要用户提供>的重载
	priority_queue<Date, vector<Date>, greater<Date>> q2;
	q2.push(Date(2022, 1, 7));
	q2.push(Date(2022, 1, 1));
	q2.push(Date(2022, 1, 31));
	cout << q2.top() << endl;
}

在这里插入图片描述

priority_queue的模拟实现

priority_queue的底层实际上就是堆结构,可以参考博主之前写的有关堆的文章数据结构之堆

namespace nzb
{
	//比较方式(使内部结构为大堆)
	template<class T>
	class Less
	{
	public:
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};
	//比较方式(使内部结构为小堆)
	template<class T>
	class Greater
	{
	public:
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};

	template<class T, class Container = vector<T>, class Compare = Less<T>>
	class  priority_queue
	{
	public:
		priority_queue()
		{}

		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
		{
			//将迭代器中的数据插入优先级队列中
			while (first != last)
			{
				_con.push_back(*first);
				first++;
			}
			//从最后一个非叶子结点向上调整
			for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--)
			{
				AdjustDown(i);
			}
		}
		//堆的向上调整
		void AdjustUp(size_t child)
		{			
			size_t parent = (child - 1) / 2;//找到父节点
			while (child > 0)
			{
				if (_com(_con[parent], _con[child]))//判断是否需要交换
				{
					//交换父子结点
					swap(_con[parent], _con[child]);
					//继续向上调整
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}
		//向下调整
		void AdjustDown(size_t parent)
		{			
			size_t child = parent * 2 + 1;//算出左子节点的下标
			while (child < _con.size())
			{
				//找出子结点中符合比较方式的值
				if (child + 1 < _con.size() && _com(_con[child], _con[child + 1]))
				{
					child++;
				}
				//通过所给比较方式确定是否需要交换结点位置
				if (_com(_con[parent], _con[child]))
				{
					//交换父子结点
					swap(_con[parent], _con[child]);
					//继续向下调整
					parent = child ;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}
		//插入数据
		void push(const T& x)
		{
			_con.push_back(x);
			AdjustUp(_con.size() - 1);//将最后一个元素向上调整
		}
		//删除数据
		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);//交换首尾数据
			_con.pop_back();//尾删
			AdjustDown(0);//首元素向下调整
		}
		//访问头元素
		const T& top() const
		{
			return _con[0];
		}
		//获取队列中有效元素个数
		size_t size()
		{
			return _con.size();
		}
		//判空
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;//底层容器
		Compare _com;//比较方式
	};
}

到此这篇关于c++中priority_queue的使用与模拟实现的文章就介绍到这了,更多相关C++ priority_queue内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中priority_queue的使用与模拟实现

本文链接: https://www.lsjlt.com/news/140324.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中priority_queue的使用与模拟实现
    目录priority_queue的使用priority_queue简介priority_queue的使用priority_queue的模拟实现priority_queue的使用 pr...
    99+
    2024-04-02
  • C++中priority_queue模拟实现的代码示例
    目录priority_queue概述 priority_queue定义 priority_queue特点 构造函数 修改相关函数pushpop容量相关函数sizeempty元素访问相...
    99+
    2024-04-02
  • C++中list的使用与模拟实现
    目录一、list的介绍以及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity...
    99+
    2024-04-02
  • c++中vector的使用和模拟实现
    一、接口介绍 1、插入数据 void push_back(const T& x) 在当前vector尾部插入x,如果容量不够扩大二倍。 iterator insert(it...
    99+
    2024-04-02
  • C++ 容器适配器priority_queue的使用及实现代码
    优先级队列(Priority Queue) 队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最...
    99+
    2024-04-02
  • C++中memcpy函数的使用以及模拟实现
    目录前言一、什么是memcpy二、memcpy与strcpy的区别1.strcpy2.memcpy三、模拟实现memcpy总结前言 memcpy函数如何使用,以及如何实现我们自己的m...
    99+
    2024-04-02
  • C++  STL _ Vector使用及模拟实现
    目录1.Vector的介绍1.1 Vector的介绍2.Vector的使用2.1 vector的定义2.2 vector 迭代器的使用 2.3 vector的空间增长问题3...
    99+
    2024-04-02
  • C++ stack与queue模拟实现详解
    目录stack与queue模拟实现 stackqueue为什么选择deque作为stack和queue的底层默认容器总结stack与queue模拟实现 在stl中,stack(...
    99+
    2024-04-02
  • C++list的模拟实现
    目录一、节点的结构,list的迭代器的结构,以及list的结构1、节点的结构2、迭代器的结构3、list的结构二、迭代器的实现1、*运算符重载2、++ 与 --运算符3、->运...
    99+
    2023-05-16
    C++ list C++ list模拟实现
  • C++详细讲解stack与queue的模拟实现
    目录容器适配器双端队列概念结构deque迭代器优缺点stack模拟queue模拟实现容器适配器 适配器是一种设计模式(设计模式是一套反复使用的、大部分人知道的代码设计经验的总结),该...
    99+
    2024-04-02
  • C++实现stack与queue数据结构的模拟
    目录stack模拟实现queue模拟实现栈和队列都是容器适配器搞出来的,对容器进行封装,从而实现先进先出和后进先出的结构 stack模拟实现 常规实现数据结构的思路 template...
    99+
    2023-05-16
    C++ stack与queue模拟 C++ stack模拟实现 C++ queue模拟实现
  • C++中如何模拟实现vector
    这篇文章给大家分享的是有关C++中如何模拟实现vector的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vector接口总览namespace nzb{//模拟实现vectortemplate<c...
    99+
    2023-06-25
  • C++中vector的模拟实现实例详解
    目录vector接口总览 默认成员函数 构造函数 拷贝构造 赋值重载 析构函数 迭代器相关函数 begin和end 容量相关函数 size和capacity reserve resi...
    99+
    2024-04-02
  • C++ STL vector的模拟实现
    1. vector的介绍和使用 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对v...
    99+
    2024-04-02
  • C++中STL vector的模拟实现示例
    这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存...
    99+
    2023-06-14
  • C++模拟实现vector的方法
    今天小编给大家分享一下C++模拟实现vector的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 模拟实现vecto...
    99+
    2023-07-02
  • c++中vector模拟实现的示例分析
    这篇文章将为大家详细讲解有关c++中vector模拟实现的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、vector是什么?vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储...
    99+
    2023-06-14
  • C语言内存函数的使用及其模拟实现
    目录前言memcpymemcmpmemmovememset总结前言 在C语言中,我们除了会经常用到与字符相关的函数,我们还会使用到与内存相关的库函数。今天我们就来学习几个常见的内存函...
    99+
    2024-04-02
  • C++模拟实现list功能
    目录list介绍构造函数无参构造函数有参构造函数模板区间构造函数拷贝构造函数赋值运算符重载析构函数迭代器迭代器构造函数迭代器关系运算符重载迭代器++ --运算符重载迭代器 * 运算符...
    99+
    2024-04-02
  • C++ vector类的模拟实现方法
    vector和string虽然底层都是通过顺序表来实现的,但是他们利用顺序表的方式不同,string是指定好了类型,通过使用顺序表来存储并对数据进行操作,而vector是利用了C++...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作