首页 > 编程语言 >C++ 标准库类型priority_queue

C++ 标准库类型priority_queue

时间:2024-04-10 21:03:49浏览次数:28  
标签:priority parent C++ queue child size con

C/C++总述:Study C/C++-CSDN博客 

堆(数据结构):堆-CSDN博客


priority_queue(优先队列)

在优先队列中,元素被赋予优先级(按约定的函数来赋予优先级,底层通过来实现)。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。

定义与声明 

#include<queue>

using std::queue;

priority_queue<Type, Container, Functional>

 Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大堆。

//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
 //降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数

常用函数

成员函数

功能
top()返回priority_queue的首元素
push()向priority_queue中插入一个元素
pop()从priority_queue队头删除一个元素
size()返回priority_queue当前的长度
empty()返回priority_queue是否为空,1为空、0不为空

注意:
priority_queue取出队首元素是使用top,而不是front,这点一定要注意!!

priority_queue的模拟实现 

#include<string>
#include<vector>
#include<iostream>
using namespace std;

namespace myPriority_Queue
{
	template <class T>
	struct less
	{
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};

	template <class T>
	struct greater
	{
		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:
		void adjust_up(size_t child)
		{
			//Compare com;
			size_t parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[child] > _con[parent])等同于if (_con[parent] < _con[child])
				if (Compare()(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
					break;
			}
		}
		void adjust_down(size_t parent)
		{
			Compare com;
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				//得出较大(小堆则较小)的那个孩子
				if (child + 1 < _con.size()
					//&& _con[child] < _con[child + 1])
					&& com(_con[child], _con[child + 1]))
					child++;

				//if (_con[child] > _con[parent])
				if (com(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
					break;
			}
		}
		void push(const T& val)
		{
			_con.push_back(val);
			adjust_up(_con.size() - 1);
		}
		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}
		const T& top() const
		{
			return _con[0];
		}
		size_t size() const
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

标签:priority,parent,C++,queue,child,size,con
From: https://blog.csdn.net/weixin_73225182/article/details/137607880

相关文章

  • 《C++程序设计》阅读笔记【7-堆和拷贝构造函数】
    ......
  • C++ 获取数组大小、多维数组操作详解
    获取数组的大小要获取数组的大小,可以使用sizeof()运算符:示例intmyNumbers[5]={10,20,30,40,50};cout<<sizeof(myNumbers);结果:20为什么结果显示为20而不是5,当数组包含5个元素时?这是因为sizeof()运算符返回类型的大小(以字节为单位)。要找出数组有多少......
  • C++ Primer Plus(第6版):封装、继承与多态
    C语言编程原理C语言在最初面试时是一种过程性(procedural)语言,这意味着它强调的是编程的算法方面,程序命令计算机按照一系列流程生成特定的结果。但是随着程序规模的扩大,程序经常使用分支语句,很多旧式程序的执行路径很混乱(被称为“意大利面条式编程”,突出一个混乱程度)。计算机科学家......
  • 突破编程_C++_网络编程(Windows 套接字(阻塞模式与非阻塞模式))
    1阻塞模式与非阻塞模式的概念(1)阻塞模式概念:在阻塞模式下,当套接字执行I/O操作时,如果操作不能立即完成,调用函数会一直等待直到操作完成。在等待期间,执行操作的线程会被阻塞,无法继续执行其他任务。特点:简单直观:对于许多简单的网络应用来说,阻塞模式编程简单直观,易于理......
  • c++11实现线程池
    c++11实现线程池c++线程库thread创建线程和同步的方式jion,detach#include<iostream>#include<thread>voidprintf_hw(std::strings){ std::cout<<s<<"\n";}intmain(){ std::threada(printf_hw,"nihao"); //a.join();//同步 a.de......
  • [C++] 小游戏 斗破苍穹 2.10.1 版本 zty出品
    目录前言先赞后看 养成习惯正文后记前言   大家好,今天zty(<-痧蔽)带来的是斗破苍穹2.10.1版本本版本为战斗更新加入了四个新怪物和四个新装备并且修复了许多bug,希望大家喜欢,今天的赞不多要要50个就够了先赞后看 养成习惯正文#include<stdio.h>#inc......
  • template—模板初阶(C++)
        本篇将会对Cpp中的模板进行一个简单的介绍(后序还关系模板进阶,对模板的内容进行更深入的讲解),其中包括模板的使用:函数模板、类模板,以及对于泛型编程的理解。其中的重点为函数模板,介绍了函数模板的原理、隐式实例化和显示实例化、还有模板参数的匹配规则。目录如下......
  • 内存管理new and delete(C++)
        在本篇中,将会较为详细的介绍在Cpp中的两个新操作符new和delete,将会介绍其中的底层原理,以及这两个操作符的使用方法。其中还介绍了new/delete操作符使用的细节,还扩展了一些有关定位new表达式的知识点。最后总结了malloc/free与new/delete的区别。目......
  • UE中创建Actor添加组件初始化(UEC++个人学习笔记)
    在ue中创建actorc++类,在actor的.h文件中添加五个组件又由上到下的作用分别为:获取下SceneComponent,用于操作其Transform等相应接口。获取静态模型组件。获取盒子碰撞组件。获取粒子特效组件。获取音频组件。#include"Components/SceneComponent.h"#include"Components......
  • C++核心编程
    C++核心编程本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放......