heapq

Crates.ioheapq
lib.rsheapq
version
sourcesrc
created_at2023-10-24 01:45:11.597262+00
updated_at2025-03-11 12:22:44.520649+00
descriptionPriority Queue with scoring function
homepagehttps://crates.io/crates/heapq
repositoryhttps://github.com/lucidfrontier45/heapq
max_upload_size
id1012009
Cargo.toml error:TOML parse error at line 19, column 1 | 19 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include`
size0
杜世橋 Du Shiqiao (lucidfrontier45)

documentation

https://docs.rs/heapq

README

Heapq

Priority Queue with scoring function

Usage

  • Rust Edtion: 2024
  • MSRV: 1.85
[dependencies]
heapq = "0.2.0"

In the code you first need to create an instance with heaqp::PriorityQueue::new. It takes a closure that converts your item type &T into score type S: Ord. Then you can use push/pop/peek methods in the same way as std::collections::BinaryHeap.

Example

use std::cmp::Reverse;

use heapq::PriorityQueue;

fn main() {
    // a score function that returns the length of a string
    let score_fn = Box::new(|s: &String| s.len());
    // create a new priority queue with the score function
    let mut queue = PriorityQueue::new(score_fn);

    // the queue is empty at the beginning
    assert!(queue.peek().is_none());

    // push some items into the queue
    // the score function is used to calculate the score of each item
    queue.push("a".to_string()); // score = 1
    queue.push("ccc".to_string()); // score = 3
    queue.push("bb".to_string()); // score = 2

    // you can also push an item with a explicit score
    queue.push_with_score("b".to_string(), 10); // score = 10

    // peek the item with the highest priority
    assert_eq!(queue.peek(), Some(&"b".to_string()));

    // pop the item with the highest priority
    assert_eq!(queue.pop(), Some("b".to_string()));
    assert_eq!(queue.pop(), Some("ccc".to_string()));
    assert_eq!(queue.pop(), Some("bb".to_string()));
    assert_eq!(queue.pop(), Some("a".to_string()));

    // the queue is empty again
    assert!(queue.peek().is_none());

    // you can also use a reverse order
    let score_fn = Box::new(|s: &String| Reverse(s.len()));
    let mut queue = PriorityQueue::new(score_fn);

    queue.push("a".to_string()); // score = -1
    queue.push("ccc".to_string()); // score = -3
    queue.push("bb".to_string()); // score = -2

    // remember to use Reverse when pushing an item with a explicit score
    queue.push_with_score("b".to_string(), Reverse(10)); // score = -10

    assert_eq!(queue.peek(), Some(&"a".to_string()));
    assert_eq!(queue.pop(), Some("a".to_string()));
    assert_eq!(queue.pop(), Some("bb".to_string()));
    assert_eq!(queue.pop(), Some("ccc".to_string()));
    assert_eq!(queue.pop(), Some("b".to_string()));
    assert!(queue.peek().is_none());
}
Commit count: 5

cargo fmt