Я хочу сохранить MyStruct
в BinaryHeap
, используя мои собственные критерии заказа. Мне нужно реализовать Ord
и PartialEq
, но будет ли куча использовать PartialEq
только для заказа или также будет использовать его, чтобы решить, что MyStruct
экземпляр 1 и MyStruct
экземпляр 2 логически являются одним и тем же объектом и следовательно, я могу покачивать вещи за моей спиной?
Например, может ли он решить: «Ну, следующий inst2
, но у меня уже есть inst1
здесь, в каком-то кеше, и я просто верну его снова»?
Мои экземпляры - очень разные объекты - у них просто одинаковый ключ сортировки.
У меня есть этот код. Это плохо, потому что моя реализация Eq
сравнивает только то, что я хочу отсортировать? Я хочу поместить эти объекты в BinaryHeap
. В моем текущем коде я помещаю их в Vec
и сортирую после каждой вставки, которая является неоптимальной.
type TQIFunc = fn() -> ();
struct TimerQueueItem {
when: Instant, // when it should run
name: String, // for trace only
what: TQIFunc, // what to run
}
impl Ord for TimerQueueItem {
fn cmp(&self, other: &TimerQueueItem) -> Ordering {
other.when.cmp(&self.when)
}
}
// `PartialOrd` needs to be implemented as well.
impl PartialOrd for TimerQueueItem {
fn partial_cmp(&self, other: &TimerQueueItem) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl PartialEq for TimerQueueItem {
fn eq(&self, other: &Self) -> bool {
self.when == other.when
}
}
impl Eq for TimerQueueItem {}
TQI1
равно TQI2
, если они имеют одинаковое значение when
- когда на самом деле я просто хочу отсортировать по значению when
.
Будет ли BinaryHeap
делать другие предположения о равенстве двух вещей, или он просто используется для сортировки? Я согласен с тем, что то, что делает код сегодня, не является хорошим основанием для ответа; Меня больше всего беспокоит то, что BinaryHeap
не думает, что TQI1
является логическим клоном TQI2
, потому что я утверждаю, что они равны.