yiskw note

機械学習やプログラミングについて気まぐれで書きます

【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

このエラーはf32f64std::cmp::Ordが実装されていないことが原因でした.
std::cmp::Ordが実装されていない理由は,std::f64::NANの比較ができない(NaN != NaN)ためです.
そのためsortを実行することができないということでした.

方法

ただ調べてみると,f32f64にはPartialOrdが実装されており,
NaNが含まれていないことが事前にわかっている場合には,
sort_bypartial_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]

参考