这类似于如何将自定义比较器函数与 BTreeSet 一起使用?但是就我而言,直到运行时我才会知道排序标准。可能的标准很广泛并且不能被硬编码(想想像按到目标的距离排序 or 按有效负载中的特定字节排序或其组合)。创建地图/集合后,排序标准不会更改。
我看到的唯一替代方案是:
- use a
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)
}
是否可以将比较器闭包作为参数传递给需要它的每个节点操作?它将由树包装器拥有,而不是在每个节点中克隆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)