priority_queue解读

本文深入讲解优先队列的实现原理及应用,包括头文件引入、声明格式、基本操作如push、pop、size等,并通过代码示例展示如何使用优先队列进行自动排序。

引入:

优先队列是一种特殊的队列,在学习堆排序的时候就有所了解
	那么优先队列是什么呢? 
说白了,就是一种功能强大的队列。如果不太清楚队列,可以看看我这篇博客。

它的功能强大在哪里呢? 
四个字:自动排序。

头文件和声明

#include<queue>
using namespace std;

其次,一个优先队列声明的基本格式是:
**priority_queue<结构类型> 队列名; **

priority_queue <int> i;
priority_queue <double> d;

还有这些:

priority_queue <node> q;
//node是一个结构体
//结构体里重载了‘<’小于符号
priority_queue <int,vector<int>,greater<int> > q;
//不需要#include<vector>头文件
//注意后面两个“>”不要写在一起,“>>”是右移运算符
priority_queue <int,vector<int>,less<int> >q;

//结构体
struct node
{
    int x,y;
    bool operator < (const node & a) const//重载 “<”;
    {
        return x<a.x;
    }
};

基本操作

q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
q.back();//返回q的末尾元素

代码验证:

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q;
int main()
{
    q.push(10),q.push(8),q.push(12),q.push(14),q.push(6);
    while(!q.empty())
        printf("%d ",q.top()),q.pop();
}

程序大意就是在这个优先队列里依次插入10、8、12、14、6,再输出。
结果是什么呢?
14 12 10 8 6
也就是说,它是按从大到小排序的!

#include<cstdio>
#include<queue>
using namespace std;
struct node
{
    int x,y;
    bool operator < (const node & a) const
    {
        return x<a.x;
    }
}k;
priority_queue <node> q;
int main()
{
    k.x=10,k.y=100; q.push(k);
    k.x=12,k.y=60; q.push(k);
    k.x=14,k.y=40; q.push(k);
    k.x=6,k.y=80; q.push(k);
    k.x=8,k.y=20; q.push(k);
    while(!q.empty())
    {
        node m=q.top(); q.pop();
        printf("(%d,%d) ",m.x,m.y);
    }
}

程序大意就是插入(10,100),(12,60),(14,40),(6,20),(8,20)这五个node。
再来看看它的输出:
(14,40) (12,60) (10,100) (8,20) (6,80)

它也是按照重载后的小于规则,从大到小排序的。

#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]={10,12,14,6,8};
int main()
{
    for(int i=0;i<5;i++)
        p.push(a[i]),q.push(a[i]);

    printf("less<int>:")
    while(!p.empty())
        printf("%d ",p.top()),p.pop();  

    pritntf("\ngreater<int>:")
    while(!q.empty())
        printf("%d ",q.top()),q.pop();
}

结果:

less:14 12 10 8 6

greater:6 8 10 12 14

所以,我们可以知道,less是从大到小,greater是从小到大。

class IntegratedTaskManager: def __init__(self, config_dir: str = "config"): self.config_dir = Path(config_dir) self.task_parser: Optional[TaskParser] = None self.crane_assigner: Optional[CraneAssigner] = None self.device_status_checker: Optional[DeviceStatusChecker] = None self.device_status_monitor: Optional[DeviceStatusMonitorImpl] = None self.task_queue: Optional[TaskQueueImpl] = None self.device_manager = None self.is_initialized = False self.is_running = False async def initialize(self, device_manager): if self.is_initialized: return if device_manager is None: raise ValueError("device_manager 不能为 None,请提供有效的设备管理器") print("[INFO] 初始化集成任务管理器...") self.device_manager = device_manager process_config = self.config_dir / "process_config.json" crane_config = self.config_dir / "crane_config.json" devices_config = self.config_dir / "devices" self.task_parser = TaskParser(str(process_config)) self.crane_assigner = CraneAssigner(str(crane_config)) self.device_status_monitor = DeviceStatusMonitorImpl( self.device_manager, str(devices_config) ) self.device_status_checker = DeviceStatusChecker(self.device_status_monitor) self.task_queue = TaskQueueImpl( self.device_status_monitor, self.crane_assigner, self.device_manager ) self.is_initialized = True print("[初始化完成") async def start_monitoring(self): """启动设备监控""" if not self.is_initialized: raise RuntimeError("请先调用 initialize()") if self.is_running: return await self.device_status_monitor.start_monitoring() self.is_running = True print("[OK] 设备监控已启动") def generate_tasks(self, requests: List[Dict]) -> List[Dict]: if not self.is_initialized: raise RuntimeError("请先调用 initialize()") print(f"[INFO] 处理 {len(requests)} 个请求...") all_tasks = [] for request in requests: try: # 使用TaskParser解析请求 tasks = self.task_parser.parse_request(request) # 使用CraneAssigner为每个任务分配天车 for task in tasks: crane = self.crane_assigner.assign_crane(task["工序"]) task["天车"] = crane all_tasks.extend(tasks) except Exception as e: print(f"[ERROR] 处理请求失败: {e}") print(f"生成 {len(all_tasks)} 个任务") return all_tasks async def process_tasks(self, task_dicts: List[Dict]) -> Dict[str, Any]: if not self.is_running: raise RuntimeError("请先调用 start_monitoring()") print(f"开始处理 {len(task_dicts)} 个任务...") self.task_queue.add_dict_tasks(task_dicts) await asyncio.sleep(2) executed_count = 0 max_cycles = 20 cycle = 0 while (self.task_queue.pending_tasks and cycle < max_cycles): cycle += 1 executed = await self.task_queue.process_next_available_task() if executed: executed_count += 1 print(f"执行第 {executed_count} 个任务") await asyncio.sleep(0.5) queue_status = self.task_queue.get_queue_status() return { "处理周期": cycle, "队列状态": queue_status, "执行统计": { "总任务数": len(task_dicts), "成功执行": queue_status["已完成"], "发送失败": queue_status["失败"], "待处理": queue_status["待处理"] } } def get_standardized_output(self, requests: List[Dict]) -> List[Dict]: return self.generate_tasks(requests) async def run_complete_workflow(self, requests: List[Dict]) -> Dict[str, Any]: try: if not self.is_initialized: await self.initialize() tasks = self.generate_tasks(requests) if not self.is_running: await self.start_monitoring() result = await self.process_tasks(tasks) result["生成的任务"] = tasks result["输入请求数"] = len(requests) return result except Exception as e: print(f"[ERROR] 工作流执行失败: {e}") raise def export_tasks_to_json(self, requests: List[Dict], output_file: str) -> bool: try: tasks = self.generate_tasks(requests) output_path = Path(output_file) output_path.parent.mkdir(parents=True, exist_ok=True) with open(output_path, 'w', encoding='utf-8') as f: json.dump(tasks, f, indent=2, ensure_ascii=False) print(f"[OK] 已导出 {len(tasks)} 个任务到: {output_file}") return True except Exception as e: print(f"[ERROR] 导出失败: {e}") return False async def get_system_status(self) -> Dict[str, Any]: status = { "初始化状态": self.is_initialized, "运行状态": self.is_running } if self.is_initialized: status["配置目录"] = str(self.config_dir) if self.is_running: status["设备监控统计"] = self.device_status_monitor.get_monitoring_statistics() status["队列状态"] = self.task_queue.get_queue_status() return status async def stop(self): if self.is_running: await self.device_status_monitor.stop_monitoring() self.is_running = False print("[OK] 系统已停止") 分步的来解读一下这段代码的逻辑
最新发布
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KING_阿飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值