如何解决如何使用运行时定义的比较器定义有序的 Map/Set?
这与 How do I use a custom comparator function with BTreeSet? 类似,但是在我的情况下,直到运行时我才知道排序标准。可能的标准很广泛,不能硬编码(比如按目标距离排序或按有效载荷中的特定字节排序或它们的组合)。地图/集创建后排序条件不会改变。
我看到的唯一选择是:
- 使用
Vec
,但 log(n) 插入和删除至关重要 - 用排序标准(直接或间接)包装每个元素,但这似乎很浪费
这对于标准 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)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。