Как найти min вектора без Ord?

#rust

#Ржавчина

Вопрос:

У меня есть вектор RTSPUrl , и я хочу найти наименьший элемент.

 struct RTSPUrl { /* fields omitted */ }

fn main() {
    let rtsp_urls = std::vec::Vec::<RTSPUrl>::new();
    let minimum_element = rtsp_urls.iter().min();
}
  

Однако компилятор жалуется, что RTSPUrl должен реализовать Ord .

 error[E0277]: the trait bound `RTSPUrl: std::cmp::Ord` is not satisfied
 --> src/main.rs:5:44
  |
5 |     let minimum_element = rtsp_urls.iter().min();
  |                                            ^^^ the trait `std::cmp::Ord` is not implemented for `RTSPUrl`
  |
  = note: required because of the requirements on the impl of `std::cmp::Ord` for `amp;RTSPUrl`
  

Но этот тип не из моего ящика, поскольку он генерируется protobuf. Есть ли что-нибудь еще, что я могу сделать?

Комментарии:

1. Если это не реализуется Ord , откуда вы знаете, что существует минимальное значение? Если бы я сказал вам, что элемент с индексом 0 был наименьшим, как бы вы узнали, был ли я прав или нет?

Ответ №1:

Вы можете использовать min_by и реализовать упорядочение самостоятельно:

 let minimum_element = rtsp_urls.iter().min_by(|a, b| {
    // return an Ordering based on a and b
    Ordering::Equal
});
  

Или, если вы просто упорядочиваете по какому-либо свойству RTSPUrl , которое реализует Ord , вы можете использовать min_by_key :

 let minimum_element = rtsp_urls.iter().min_by_key(|url| {
    // return something that implements Ord based on url
    url.something()
});
  

Вы не указали, как RTSPUrl выглядит или как вы хотели бы, чтобы он был упорядочен, но один из этих вариантов должен работать. Ссылка на игровую площадку.

Тот же шаблон ( *_by() и *_by_key() ) используется в другом месте, например max , или slice.sort .

Ответ №2:

Вы можете использовать Iterator::min_by и реализовать собственное сравнение, основанное на содержимом RTSPUrl :

 let minimum_element = rtsp_urls.iter().min_by(|a, b| ...)
  

Ordering Я полагаю, ваша функция должна возвращать an .