【Rust】Vec<f32>やVec<f64>に対してソートを実行する
概要
最近Rustについて勉強しているのですが,Vec<f64>
に対してsort
を実行しようとしたところ,
以下のようなエラーを吐かれてしまいました.
error[E0277]: the trait bound `f64: std::cmp::Ord` is not satisfied
そこでVec<f64>
に対してソートを行う方法について調べたので,こちらにメモを残しておきます.
エラーの原因
error[E0277]: the trait bound `f64: std::cmp::Ord` is not satisfied
このエラーはf32
やf64
でstd::cmp::Ord
が実装されていないことが原因でした.
std::cmp::Ord
が実装されていない理由は,std::f64::NAN
の比較ができない(NaN != NaN
)ためです.
そのためsort
を実行することができないということでした.
方法
ただ調べてみると,f32
やf64
にはPartialOrd
が実装されており,
NaN
が含まれていないことが事前にわかっている場合には,
sort_by
とpartial_cmp
を用いることでソートが可能とのことでした.
以下が実装例となります.
fn main() { let mut v: Vec<f64> = vec![10.2, 4.6, 0.01, 6.2, 12.0]; v.sort_by(|a, b| a.partial_cmp(b).unwrap()); println!("{:?}", v); }
[0.01, 4.6, 6.2, 10.2, 12.0]