关于 use std::cmp::Reverse
use std::cmp::Reverse;
use std::collections::BinaryHeap;
fn main() {
let mut heap = BinaryHeap::new();
(0..10)
.map(|i| {
if heap.len() >= 3 {
println!("Poped: {:?}.", heap.pop());
}
heap.push(Reverse(i));
})
.for_each(drop);
println!("{:?}", heap);
}
Poped: Some(Reverse(0)).
Poped: Some(Reverse(1)).
Poped: Some(Reverse(2)).
Poped: Some(Reverse(3)).
Poped: Some(Reverse(4)).
Poped: Some(Reverse(5)).
Poped: Some(Reverse(6)).
[Reverse(7), Reverse(8), Reverse(9)]
Rust Playground
对于自定义的 impl 类型:
use std::cmp::Ordering;
#[derive(Debug, PartialEq, Eq)]
struct MyU64Min(u64);
impl From<u64> for MyU64Min {
fn from(i: u64) -> Self {
Self(i)
}
}
impl PartialOrd for MyU64Min {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
other.0.partial_cmp(&self.0)
}
}
impl Ord for MyU64Min {
fn cmp(&self, other: &MyU64Min) -> Ordering {
self.partial_cmp(other).unwrap()
}
}
fn main() {
let mut heap = BinaryHeap::new();
(0..10)
.map(|i| {
if heap.len() >= 3 {
println!("Poped: {:?}.", heap.pop());
}
heap.push(MyU64Min::from(i));
})
.for_each(drop);
println!("{:?}", heap);
}
Poped: Some(MyU64Min(0)).
Poped: Some(MyU64Min(1)).
Poped: Some(MyU64Min(2)).
Poped: Some(MyU64Min(3)).
Poped: Some(MyU64Min(4)).
Poped: Some(MyU64Min(5)).
Poped: Some(MyU64Min(6)).
[MyU64Min(7), MyU64Min(8), MyU64Min(9)]
Rust Playground
Rust Playground