I want to populate a binary heap with floats--more specifically, I'd like to implement a min-heap.
It seems that floats do not support Ord
and thus aren't usable out of the box. My attempts to wrap them have so far failed. However it seems that if I could wrap them then I could also implement Ord
in such a way that it would effectively make BinaryHeap
a min-heap.
Here's an example of a wrapper I tried:
#[derive(PartialEq, PartialOrd)]
struct MinNonNan(f64);
impl Eq for MinNonNan {}
impl Ord for MinNonNan {
fn cmp(&self, other: &MinNonNan) -> Ordering {
let ord = self.partial_cmp(other).unwrap();
match ord {
Ordering::Greater => Ordering::Less,
Ordering::Less => Ordering::Greater,
Ordering::Equal => ord
}
}
}
The problem is pop
returns the values as though it were a max-heap.
What exactly do I need to do to populate a BinaryHeap
with f64
values as a min-heap?
minheap.push(MinNonNan(42.0))
andif let Some(MinNonNan(root)) = minheap.pop() ...
– CauliclePartialOrd
to agree withOrd
. They aren't really meant to contradict each other -- the compiler may make optimizations based on the assumption that they are effectively the same. – Buckwheat