rust F64的BTreeMap

afdcj2ne  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(111)

我想有一个排序数组,其中有一个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);
}
jrcvhitl

jrcvhitl1#

我想你可能正在寻找ordered_float crate和OrderedFloat(可以存储NaN,将其排序在+inf之上)或NotNan(不能存储NaN)结构体,它们都是类似浮点型的类型,即EqOrd(违反IEEE标准)。

nbnkbykc

nbnkbykc2#

浮点数不适合作为键。也许你应该考虑将它们转换为整数或字符串。例如,如果您只关心小数点分隔符后的2位数,则可以执行类似n*100的操作,四舍五入并转换为整数类型。

koaltpgm

koaltpgm3#

可以使用nutype crate。
使用nutype,您可以在newtype上添加finite验证,排除NaNInfinity。这允许导出EqOrd

use nutype::nutype;
use std::collections::BTreeMap;

#[nutype(validate(finite))]
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Float(f64);

#[derive(Debug)]
pub struct MyStruct {
  pub map: BTreeMap<Float, Float>
}

impl MyStruct {
  pub fn new() -> MyStruct {
    MyStruct {
      map: BTreeMap::new()
    }
  }
}

fn main() {
    let mut my_struct = MyStruct::new();
    let one = Float::new(1.0).unwrap();
    let two = Float::new(2.0).unwrap();
    my_struct.map.insert(one, two);

    println!("{my_struct:?}");
}

输出:

MyStruct { map: {Float(1.0): Float(2.0)} }

相关问题