2015-02-11 50 views
2

我明白爲什麼浮點數沒有Ord的實現,但是當我想要懶惰並使用迭代器時,這並沒有特別的幫助我。如何獲得包含浮點數的迭代器的最小值?

沒有任何人有含浮點數的迭代器周圍的工作或一個簡單的方法來取最小值(最小,min_by)?

我知道一個可以進行排序(這是慢)或其他類型的包裝,並實施必要的行業(這是冗長的),但我希望的東西多了幾分優雅。

回答

5

花車有自己min method,處理NaN的一致,這樣你就可以摺疊迭代器:

use std::f64; 

fn main() { 
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN]; 

    let min = x.iter().fold(f64::INFINITY, |a, &b| a.min(b)); 
    println!("{}", min); 
} 

打印-10

如果你想不同的NaN處理,你可以使用PartialOrd::partial_cmp。例如,如果您想宣傳NaN,請使用以下摺疊:

use std::f64; 
use std::cmp::Ordering; 

fn main() { 
    let x = [2.0, 1.0, -10.0, 5.0, f64::NAN]; 

    let min = x.iter().fold(f64::INFINITY, |a, &b| { 
     match PartialOrd::partial_cmp(&a, &b) { 
      None => f64::NAN, 
      Some(Ordering::Less) => a, 
      Some(_) => b, 
     } 
    }); 
    println!("{}", min); 
} 
+0

的std :: CMP :: partial_min不存在了。 – 2017-04-13 14:20:59

0

也許這樣?

fn main() { 
    use std::cmp::Ordering; 
    let mut x = [2.0, 1.0, -10.0, 5.0]; 
    x.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)); 
    println!("min in x: {:?}", x); 
} 

有一件事我掙扎是sort_by變異到位矢量,所以你不能在一個鏈直接使用它。

相關問題