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

C++中priority_queue模拟实现的代码示例

2024-04-02 19:04:59 181人浏览 薄情痞子
摘要

目录priority_queue概述 priority_queue定义 priority_queue特点 构造函数 修改相关函数pushpop容量相关函数sizeempty元素访问相

priority_queue概述

priority_queue定义

  • 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。

priority_queue特点

  • 优先队列是一种容器适配器,首先要包含头文件 #include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
  • 优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
  • 注意:默认情况下priority_queue是大根堆。如果想让其生成小根堆,需要使用到仿函数或者Lambda表达式。

构造函数

由于priority_queue是一种容器适配器,适配的是vector,我们在vector中已经写过它的构造函数了。故priority_queue在此不需要多余的其他构造函数。


// 创造空的优先级队列
priority_queue():m_priority_queue()
{

}

template<class Iterator>
priority_queue(Iterator first, Iterator last)
	: m_priority_queue(first, last)
{
	// 将m_priority_queue中的元素调整成堆的结构
	int count = m_priority_queue.size();
	int root = ((count - 2) >> 1);
	for (; root >= 0; root--)
	AdjustDown(root);
}

修改相关函数

push

功能:push函数用来往堆中(尾部)插入一个元素,并向上调整成新的堆。


//向上调整
void AdjustUp(int child)
{
	int parent = (child-1)>>1;
	
	while (child > 0)
	{
		//其中c是一个对象,用该对象去调用仿函数来进行比较
		if (c(m_priority_queue[parent], m_priority_queue[child]))
		{
			std::swap(m_priority_queue[parent], m_priority_queue[child]);
			child = parent;
			parent = (child - 1) >> 1;
		}
		else
		{
			break;
		}
	}

}

void push(const T& val)
{
	m_priority_queue.push_back(val);
	AdjustUp(m_priority_queue.size()-1);
}

pop

功能:pop函数弹出堆顶元素。具体步骤是:堆顶元素与最后一个数字进行交换位置。之后在进行尾删来删除堆顶。再重新向下调堆。


//向下调堆
void AdjustDown(int parent)
{
	int child = (parent << 1) + 1;
	int size = static_cast<int>(m_priority_queue.size());

	while (child< size)
	{
		if (child + 1 < size && c(m_priority_queue[child],m_priority_queue[child + 1]) )
		{
			++child;
		}

		if (c(m_priority_queue[parent], m_priority_queue[child]))
		{
			std::swap(m_priority_queue[parent], m_priority_queue[child]);
			parent = child;
			child = (parent << 1) + 1;
		}
		else
		{
			break;
		}
	}
}

void pop()
{
	assert(!m_priority_queue.empty());

	std::swap(m_priority_queue[0], m_priority_queue[m_priority_queue.size()- 1]);
	m_priority_queue.pop_back();
	AdjustDown(0);
}

容量相关函数

size

功能:用来获取堆中的元素个数。


size_t size()	const
{
	return m_priority_queue.size();
}

empty

功能:用来判断堆中是否为空。


bool empty()	const
{
	return m_priority_queue.empty();
}

元素访问相关函数

top

功能:用来获取堆顶的元素。


T& top()
{
	return m_priority_queue.front();
}

const T& top()	const
{
	return m_priority_queue.front();
}

代码实现


#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iOStream>
#include<vector>
#include<assert.h>
namespace ZJ
{
	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;
		}
	};
	template<class T,class Container=std::vector<T>, class Compare = ZJ::less<T>>
	class priority_queue
	{
	public:
		// 创造空的优先级队列
		priority_queue():m_priority_queue()
		{

		}

		template<class Iterator>
		priority_queue(Iterator first, Iterator last)
			: m_priority_queue(first, last)
		{
			// 将m_priority_queue中的元素调整成堆的结构
			int count = m_priority_queue.size();
			int root = ((count - 2) >> 1);
			for (; root >= 0; root--)
			AdjustDown(root);
		}
	public:

		//向上调整
		void AdjustUp(int child)
		{
			int parent = (child-1)>>1;
			
			while (child > 0)
			{
				if (c(m_priority_queue[parent], m_priority_queue[child]))
				{
					std::swap(m_priority_queue[parent], m_priority_queue[child]);
					child = parent;
					parent = (child - 1) >> 1;
				}
				else
				{
					break;
				}
			}

		}
		void push(const T& val)
		{
			m_priority_queue.push_back(val);
			AdjustUp(m_priority_queue.size()-1);
		}

		void AdjustDown(int parent)
		{
			int child = (parent << 1) + 1;
			int size = static_cast<int>(m_priority_queue.size());

			while (child< size)
			{
				if (child + 1 < size && c(m_priority_queue[child],m_priority_queue[child + 1]) )
				{
					++child;
				}

				if (c(m_priority_queue[parent], m_priority_queue[child]))
				{
					std::swap(m_priority_queue[parent], m_priority_queue[child]);
					parent = child;
					child = (parent << 1) + 1;
				}
				else
				{
					break;
				}
			}
		}

		void pop()
		{
			assert(!m_priority_queue.empty());

			std::swap(m_priority_queue[0], m_priority_queue[m_priority_queue.size()- 1]);
			m_priority_queue.pop_back();
			AdjustDown(0);
		}

		size_t size()	const
		{
			return m_priority_queue.size();
		}

		T& top()
		{
			return m_priority_queue.front();
		}

		const T& top()	const
		{
			return m_priority_queue.front();
		}

		bool empty()	const
		{
			return m_priority_queue.empty();
		}

	private:
		Container m_priority_queue;
		Compare c;
	};
}

总结

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

--结束END--

本文标题: C++中priority_queue模拟实现的代码示例

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

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

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

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

下载Word文档
猜你喜欢
  • C++中priority_queue模拟实现的代码示例
    目录priority_queue概述 priority_queue定义 priority_queue特点 构造函数 修改相关函数pushpop容量相关函数sizeempty元素访问相...
    99+
    2022-11-12
  • C++模拟实现vector的示例代码
    目录1.前言2.vector介绍3.vector模拟实现3.1 迭代器接口3.2 vector元素操作3. 3 构造与析构1.前言 大家在学习C++的时候一定会学到STL(标准模板库...
    99+
    2022-11-13
  • C++中priority_queue的使用与模拟实现
    目录priority_queue的使用priority_queue简介priority_queue的使用priority_queue的模拟实现priority_queue的使用 pr...
    99+
    2022-11-13
  • C语言模拟实现memmove的示例代码
    目录前言例子memmove的模拟实现具体实现步骤总结前言 上一篇我们介绍了memcpy和strcpy的区别,以及memcpy模拟实现,但这两个库函数都有一个缺点,那就是不能自己复制自...
    99+
    2022-12-29
    C语言实现memmove C语言 memmove
  • C语言模拟实现密码输入的示例代码
    目录引言思路分析代码实现代码分析引言 登录账号时我们要输入密码,密码输入错误时会提示密码错误。有时密码的输入次数会被限制,例如银行卡,当我们3次密码都输入错误时卡会被冻结。下面用C语...
    99+
    2022-11-13
  • C#模拟实现抽奖小程序的示例代码
    目录1.抽奖主界面2.操作步骤2.1 抽奖界面2.2 抽奖结果导出3.源码3.1 数据库连接3.2 抽奖程序1.抽奖主界面 2.操作步骤 S键开始; 0、1、2、3、4、5键分别对...
    99+
    2022-11-12
  • C语言模拟实现strstr函数的示例代码
    目录strstr函数介绍BF算法介绍BF算法模拟实现strstr函数KMP算法介绍KMP算法模拟实现strstr函数strstr函数介绍 C语言提供了字符串匹配函数 strstr 函...
    99+
    2022-11-13
  • C++模拟实现vector示例代码图文讲解
    目录vector的模拟实现使用memcpy拷贝问题vector的模拟实现 #include <iostream> using namespace std; #includ...
    99+
    2023-02-27
    C++ vector模拟实现 C++ vector模拟
  • C++中STL vector的模拟实现示例
    这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存...
    99+
    2023-06-14
  • c++中vector模拟实现的示例分析
    这篇文章将为大家详细讲解有关c++中vector模拟实现的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、vector是什么?vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储...
    99+
    2023-06-14
  • C++单例模式实现线程池的示例代码
    C语言单例模式实现线程池。 该代码中,使用了单例模式来创建线程池对象,保证了整个程序中只有一个线程池对象。 线程池中包含了任务队列、工作线程数组、互斥锁、条件变量等成员,通过这些成员...
    99+
    2023-05-16
    C++单例模式实现线程池 C++单例模式 线程池 C++ 线程池 C++ 单例模式
  • iOS实现模拟定位功能的示例代码
    前言 App中越来越多的功能依赖用户实际的位置,例如基于用户位置提供推荐数据、基于定位判断某些功能是否可用,但是在开发调试中XCode却没有提供自定义的模拟定位的功能,所以本文主要...
    99+
    2022-05-16
    iOS 模拟定位
  • Python实现蒙特卡洛模拟的示例代码
    目录什么是蒙特卡洛模拟Python实现今天呢,田辛老师来给大家继续讲一个著名的项目管理工具:蒙特卡洛模拟。 当然,田辛老师既然发到CSDN上面,无论如何要给出关于蒙特卡洛模拟的Pyt...
    99+
    2023-03-13
    Python实现蒙特卡洛模拟 Python蒙特卡洛模拟
  • Python&Matla实现模拟退火法的示例代码
    目录1Python实现1.1源码实现1.2 sko.SA实现2Matlab实现 2.1模拟退火法2.2蒙特卡诺法 1 Python实现 1.1 源码实现...
    99+
    2022-11-13
  • C++实现MyString的示例代码
    MyString的构造、析构、拷贝构造、赋值运算 class String { char* str; public: String(const char* p = NULL) :...
    99+
    2022-11-13
  • Python10行代码实现模拟百度搜索的示例
    目录1. 获取百度搜索接口2. 指定搜索内容3. UA伪装4. 将响应内容写入文件5. 使用浏览器打开页面1000块钱做个百度?能提出这种要求的客户实乃乙方克星、民族之光、科创永动机...
    99+
    2022-11-11
  • Java实现模拟机器人对话的示例代码
    目录前言一、Java多线程的介绍 二、创建线程并运行三、多线程间的交互前言 今天带大家来体验一下Java多线程,首先我们要明白什么是线程?什么是多线程? 进程是指一个内存中...
    99+
    2022-11-13
  • WPF模拟实现Gitee泡泡菜单的示例代码
    WPF实现 Gitee泡泡菜单 框架使用大于等于.NET40; Visual Studio 2022; 项目使用 MIT 开源许可协议; 需要实现泡泡菜单需要使...
    99+
    2022-11-13
    WPF Gitee泡泡菜单 WPF 泡泡菜单 WPF 菜单
  • C++ 容器适配器priority_queue的使用及实现代码
    优先级队列(Priority Queue) 队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最...
    99+
    2022-11-12
  • C++模拟实现vector代码分析
    本篇内容主要讲解“C++模拟实现vector代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++模拟实现vector代码分析”吧!vector的模拟实现#include <...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作