rust 如何用运行时定义的比较器定义有序Map/Set?

aiazj4mn  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(104)

这类似于How do I use a custom comparator function with BTreeSet?,但是在我的例子中,我直到运行时才知道排序标准。可能的标准是广泛的,不能硬编码(考虑 * 按到目标的距离排序 * 或 * 按负载中的特定字节排序 * 或其组合)。
我看到的唯一选择是:

  • 使用Vec,但log(n)插入和删除是至关重要的
  • 我用排序标准(直接或间接) Package 每个元素,但这似乎很浪费

这在标准的C++容器std::map/std::set中是可能的,但在Rust的BTreeMap/BTreeSet中似乎不可能。在标准库或另一个机箱中是否有替代品可以做到这一点?或者我必须自己实现这一点?
我的用例是一个类似数据库的系统,其中集合中的元素由一个模式定义,如下所示:

Element {
    FIELD x: f32
    FIELD y: f32
    FIELD z: i64

    ORDERBY z
}

但是由于模式是在运行时由用户定义的,因此元素存储在一个字节集(BTreeSet<Vec<u8>>)中,同样,元素的顺序也是由用户定义的,所以我给予BTreeSet的比较符看起来像|a, b| schema.cmp(a, b),上面的例子是硬编码的,看起来像这样:

fn cmp(a: &Vec<u8>, b: &Vec<u8>) -> Ordering {
    let a_field = self.get_field(a, 2).as_i64();
    let b_field = self.get_field(b, 2).as_i64();
    a_field.cmp(b_field)
}
vs91vp4v

vs91vp4v1#

是否可以将比较闭包作为参数传递给需要它的每个节点操作?它将由树 Package 器拥有,而不是克隆到每个节点中。

相关问题