【问题标题】:BTreeMap of f64'sf64 的 BTreeMap
【发布时间】:2022-01-09 04:37:24
【问题描述】:

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    我认为您可能正在寻找 ordered_float 板条箱和 OrderedFloat(可以存储 NaN,将其排序在 +inf 以上)或 NotNan(不能存储 NaN)结构,它们都是浮点数-类似 EqOrd 的类型(违反 IEEE 标准)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 也许您可以解释一下为什么它们不是键的好选择(缺少Ord、算术运算中的舍入等)?
      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2016-06-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多