我想有一个排序数组,其中有一个f64作为键和一个f64作为值。我需要通过找到正确的键来更新、删除和插入这个数组。我需要得到前1000个排序条目,也是第一个条目。这些操作必须快速。
通过阅读the documentation,我认为BTreeMap对我有好处。
然而,当我尝试插入它时,我得到了这个错误消息:
the trait bound `f64: Ord` is not satisfied
the trait `Ord` is not implemented for `f64`rustcE0277
使用Rust的推荐方法是什么?
我的代码:
use std::collections::BTreeMap;
pub struct MyStruct {
pub map: BTreeMap<f64, f64>
}
impl MyStruct {
pub fn new() -> MyStruct {
MyStruct {
map: BTreeMap::new()
}
}
}
fn main() {
let mut my_struct = MyStruct::new();
my_struct.map.insert(1.0, 2.0);
}
3条答案
按热度按时间jrcvhitl1#
我想你可能正在寻找
ordered_float
crate和OrderedFloat
(可以存储NaN,将其排序在+inf
之上)或NotNan
(不能存储NaN)结构体,它们都是类似浮点型的类型,即Eq
和Ord
(违反IEEE标准)。nbnkbykc2#
浮点数不适合作为键。也许你应该考虑将它们转换为整数或字符串。例如,如果您只关心小数点分隔符后的2位数,则可以执行类似n*100的操作,四舍五入并转换为整数类型。
koaltpgm3#
可以使用nutype crate。
使用nutype,您可以在newtype上添加
finite
验证,排除NaN
和Infinity
。这允许导出Eq
和Ord
:输出: