Rust中不含NAN/Inf的Vec<f64>如何获取最值,解决Ord trait未实现报错
问题描述
我尝试获取Vec<f64>的最小值和最大值,由于f64类型存在NAN和无穷大值,未实现Ord trait,编译时会抛出如下错误:
the trait `Ord` is not implemented for `f64`
若可确保Vec中永远不会包含NAN、Inf值,请问有什么方法可以正常获取该容器的最值?
解决方案
以下两种方案均基于标准库实现,无需引入第三方依赖:
- 方案1:结合f64原生最值方法 + 迭代器fold计算
f64类型本身内置了max、min方法用于两个浮点数的比较,搭配迭代器的fold方法遍历整个集合即可得到全局最值。
示例代码:
fn main() { let num_list = vec![1.2, 3.4, 0.8, 5.6, 2.1]; // 计算最大值 let max_val = num_list.iter().fold(f64::MIN, |current_max, num| current_max.max(*num)); // 计算最小值 let min_val = num_list.iter().fold(f64::MAX, |current_min, num| current_min.min(*num)); println!("最大值:{},最小值:{}", max_val, min_val); }
注意:该方案在容器为空、或存在非预期的NAN值时,会返回NAN结果,无显式报错。
- 方案2:使用partial_cmp显式断言排序
如果你需要对「无NAN/Inf」的约束做显式校验,避免异常值导致的静默错误,可以用max_by/min_by结合partial_cmp实现,遇到NAN时会直接panic提示问题。
示例代码:
use std::cmp::Ordering; fn main() { let num_list = vec![1.2, 3.4, 0.8, 5.6, 2.1]; let max_val = num_list.iter().max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap(); let min_val = num_list.iter().min_by(|a, b| a.partial_cmp(b).unwrap()).unwrap(); println!("最大值:{},最小值:{}", max_val, min_val); }
注意:第二个unwrap用于处理空容器的情况,如果你的Vec可能为空,需要自行添加空值判断逻辑。
内容的提问来源于stack exchange,提问作者til
相关产品推荐
相关产品推荐

