优先队列的emplace c优先队列用法
priority_queue是C STL中基于堆实现的容器高效,默认为大根堆,支持访问最大值。包含push、pop、top等操作,适用于Top K问题、Dijkstra算法等场景;通过更大或比较自定义器可实现小根堆及复杂逻辑,自定义时返回true表示第一个参数优先级队列。

priority_queue 是 C STL中一个非常实用的容器架构,用于实现堆结构,默认情况下是一个大根堆(顶部优先)。它常用于需要间隙访问最大或最小元素的场景,比如Dijkstra算法、合并多个网格链表等。基本最常用操作
priority_queue定义在lt;queuegt;头文件中,使用时需该头文件。
1. 默认大根堆(最大堆)
默认基于向量实现,使用较少的比较器,顶部是最大元素。
立即学习“C免费学习笔记(深入)”;
priority_queuelt;intgt; pq;pq.push(3);pq.push(1);pq.push(4);cout lt;lt; pq.top(); // 输出4pq.pop(); // 删除 4cout lt;lt; pq.top(); // 输出 3
2. 小根堆(最小堆)
通过指定更大的比较器实现:
priority_queuelt;int,vectorlt;intgt;,greaterlt;intgt;gt;min_pq;min_pq.push(3);min_pq.push(1);min_pq.push(4);cout lt;lt;min_pq.top(); // 输出1.
3. 常用成员函数push(x):插入元素x,自动调整堆结构pop():删除堆顶元素(不返回)top():返回堆顶元素(比较)empty():判断是否为空size():返回元素个数
例如:
while (!pq.empty()) { cout lt;lt;pq.top() lt;lt; " "; pq.pop();}自定义排序规则
当是存储结构体或类对象时,需要自定义比较方式。
方法一:重载动作lt;中途
当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。
454 查看详情
适用于 struct 或 class,重载小于号以控制优先级。注意:priority_queue 默认是大根堆,所以元素优先级较低。
若设 a 的优先级高于 b,应使 a lt;b 为 false。
struct Person { string name; int Age; bool operatorlt;(const Person p) const { return Age lt; p.age; // 年龄大的优先(大根堆) }};priority_queuelt;Perongt; pq;pq.push({"Alice", 25});pq.push({"Bob", 30});cout lt;lt; pq.top().name; // 输出 Bob
方法二:自定义比较结构体
更灵活的方式,尤其适合小根堆嵌套条件排序。
struct Compare { bool operator()(const Person a, const Person b) { return a.age lt; b.age; //默认大根堆逻辑 }};priority_queuelt;Person, vectorlt;Persont;, Comparegt;pq;
如果想要年龄小优先(小根堆),改为:
return a.age gt;b.age;
方法三:Lambda表达式(需结合容器声明)
不能直接用于priority_queue模板参数,但可以配合decltype 使用:
auto cmp = [](int a, int b) { return a gt; b; };priority_queuelt;int,向量lt;intgt;, decltype(cmp)gt; pq(cmp);pq.push(3); pq.push(1);cout lt;lt; pq.top(); // 输出 1 常见应用场景Top K 问题:维护大小为 K 的小根堆,方便批量找到 K 个数合并 K个小区链表:将每个链表头节点放入最小堆,每次取出节点最小并加入其后继任务调度:按优先级处理任务,高优先级任务先执行
基本上就这些。默认掌握策略、会写自定义比较器,即可应对大多数情况。注意堆不支持遍历和随机访问,只能操作堆顶。自定义排序时,牢记“返回 true 表示第一个参数优先级优先”。
以上就是Cpriority_queue怎么用_C优先常用队列操作与自定义排序的详细内容,更多请关注乐哥常识网其他相关文章!的std::访问如何处理std::variant_c 访问变体类型的最佳方式 C 如何测量程序运行时间_C 定时器实现方法 c 中的[[fallthrough]]属性有什么用_c switch-case 语句明确明白
