You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中priority-queue优先级队列如何反转排序顺序?

Rust priority-queue 包反转优先级排序方法

可以实现,priority-queue 1.2.0版本默认采用大顶堆逻辑,peek方法默认返回优先级最大的i32元素,要获取最小优先级元素可通过以下两种常用方案实现:

方案1:使用标准库Reverse包装器(推荐,代码最简洁)

标准库提供的std::cmp::Reverse包装器可以直接反转值的排序逻辑,无需自定义比较规则,适配所有实现了Ord trait的类型,示例代码如下:

use priority_queue::PriorityQueue;
use std::cmp::Reverse;

fn main() {
    // 初始化队列,优先级用Reverse包裹i32类型
    let mut pq = PriorityQueue::new();
    
    // 插入元素时将优先级套入Reverse
    pq.push("任务1", Reverse(5));
    pq.push("任务2", Reverse(2));
    pq.push("任务3", Reverse(7));
    
    // peek将返回优先级最小的元素
    let (item, min_priority) = pq.peek().unwrap();
    assert_eq!(*item, "任务2");
    // 访问Reverse的.0字段即可拿到原始i32优先级值
    assert_eq!(min_priority.0, 2);
}

方案2:自定义比较器(适合复杂排序需求)

如果后续有更灵活的排序规则需求,可以调用with_comparator方法传入自定义比较逻辑实现小顶堆,示例代码如下:

use priority_queue::PriorityQueue;

fn main() {
    // 传入比较规则:a的优先级小于b时返回true,即可实现小顶堆
    let mut pq = PriorityQueue::with_comparator(|a: &i32, b: &i32| a < b);
    
    pq.push("任务1", 5);
    pq.push("任务2", 2);
    pq.push("任务3", 7);
    
    // 无需包装,直接返回优先级最小的元素
    assert_eq!(pq.peek(), Some((&"任务2", &2)));
}

注意事项

  • 以上两种方案的排序逻辑对pop方法同样生效,会按优先级从小到大弹出元素
  • 无特殊需求优先选用Reverse方案,代码可读性更高,也符合Rust社区的常规写法

内容的提问来源于stack exchange,提问作者Max Torre Schau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:27:05