priority_queue容器简单模拟实现

news/2024/5/20 8:37:29 标签: 优先级队列, 数据结构,

第一次尝试

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

template<class T>
struct _less {
	bool operator()(const T& left, const T& right) {
		return left < right;
	}
};

template<class T>
struct _greater {
	bool operator()(const T& left, const T& right) {
		return left > right;
	}
};

template<class T, class Con = vector<T>, class Cmp = _less<T>>
class myPQueue {
public:
	//默认构造函数
	myPQueue() {}
	//使用迭代区间构造函数
	template<class it>
	myPQueue(it frist, it last)
		:v(frist, last)
	{
		//使用向下调整算法构建
		for (int root = (v.size() - 1) / 2; root >= 0; root--) {
			AdjustDown(root);
		}
	}
	//插入操作,插入后仍要形成一个,因此需要在插入后做向上调整算法
	void push(const T& val) {
		//插入
		v.push_back(val);
		//向上调整
		AdjustUp(v.size() - 1);
	}
	//删除操作,先将收尾元素互换,然后然后尾删,然后对头结点进行向下调整
	void pop() {
		//交换
		swap(v.front(), v.back());
		//删除
		v.pop_back();
		//向下调整
		AdjustDown(0);
	}
	//取顶元素,顶元素不能修改,修改会破坏结构
	const T& top() {
		return v.front();
	}
	//获取元素个数
	size_t size() {
		return v.size();
	}
	//判空操作
	bool empty() {
		return v.empty();
	}
private:
	//向下调整算法
	void AdjustDown(int root) {
		//先找到该节点的左孩子
		int child = root * 2 + 1;
		//如果这个孩子结点存在,那么就开始循环调整
		while (child < v.size()) {
			//判断右孩子是否存在
			if (child + 1 < v.size() && cmp(v[child], v[child + 1]))
				child++;
			//判断父结点是否比左右孩子中最大的还要大,如果是的,则交换
			if (cmp(v[root], v[child])) {
				//交换元素内容
				swap(v[root], v[child]);
				//修改父子下标
				root = child;
				child = root * 2 + 1;
			}
			else
				//如果父结点比两个孩子都大,则结束循环
				break;
		}
	}
	//向上调整算法
	void AdjustUp(int root) {
		//拿到节点的父结点
		int parent = (root - 1) / 2;
		//判断节点是否合法
		while (root) {
			//如果孩子结点比父结点要大,那么则交换
			if (cmp(v[parent], v[root])) {
				//交换结点内容
				swap(v[parent], v[root]);
				//更新变量
				root = parent;
				parent = (root - 1) / 2;
			}
			//如果孩子结点比父结点小,那么说明调整完毕
			else
				break;
		}
	}
private:
	Con v;
	Cmp cmp;
};

int main() {

	return 0;
}

  优先级队列本质就是,所以本代码在用vector容器实现的情况下,再对vector容器中的元素进行向下调整、向上调整,使其成为一个合格的结构;


http://www.niftyadmin.cn/n/1578899.html

相关文章

容器——stack和queue

目录容器适配器概念deque双端队列概念优缺点应用场景stack介绍接口queue介绍接口priority_queue介绍接口注意事项模拟实现容器适配器 概念 设计模式&#xff1a;设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验总结&#xff0c;代表了最佳的实践&…

服务器攒机指南-屌丝如何搭建测试平台

随着私有云、公有云的兴起&#xff08;比如大微软私有云、Microsoft Azure等等&#xff09;&#xff0c;作为IT人士想要体验它们的魅力需要付出很多的金钱&#xff0c;购买数量庞大的内存&#xff0c;提供算力强大无比的服务器。相信对技术更多专注和学习的同学&#xff0c;总会…

模板进阶

目录非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化模板分离编译概念模板的分离编译解决办法非类型模板参数 类类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之后的参数类型名称&#xff1b;非类型形参&#xff1a;就是用一个…

ios6 处理内存警告

iPhone下每个app可用的内存是被限制的&#xff0c;如果一个app使用的内存超过20M&#xff0c;则系统会向该app发送Memory Warning消息。收到此消息后&#xff0c;app必须正确处理&#xff0c;否则可能出错或者出现内存泄露。 app收到Memory Warning后会调用&#xff1a;UIAppli…

C++的I/O流

目录C语言的输入输出流是什么C中I/O流标准I/O流文件I/O流stringstream简单介绍C语言中整型转为字符型C中整型转为字符型C语言的输入输出 C 语言中我们用到的最频繁的输入输出方式就是scanf()与printf()&#xff1a; scanf()&#xff1a;从标准输入设备(键盘)读取数据&#xff…

Android让文本输入框默认不获取焦点

项目中有个检索功能&#xff0c;页面上有个EditText输入框&#xff0c;打开页面后&#xff0c;焦点默认在EditText上&#xff0c;这样的话软键盘默认就会显示出来&#xff0c;占据大半个屏幕。 后来想办法将这个给去掉了&#xff0c;原先考虑着将焦点赋给页面上的其他组件&…

Linux多线程(上)——概念与操作

目录线程概念基本概念多线程优缺点多线程用途Linux 进程 VS 线程进程与线程进程中多线程的共享进程与线程关系图线程控制编译问题创建线程线程创建函数线程ID退出线程线程等待线程分离线程概念 基本概念 概念&#xff1a;借助进程理解线程&#xff1a; 线程是进程中的一条执行…

EasyUI-增删改操作

最近公司要用easyui&#xff0c;这里自己看了官网几篇文章&#xff0c;遇到些问题&#xff0c;大多数的问题都是敲代码的时候笔误&#xff0c;其他有些地方确实需要注意一下&#xff0c;这里做些笔记。 1.在mysql中建好表之后修改id字段为递增字段&#xff0c;发现这个奇怪的my…