这类似于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)
}
1条答案
按热度按时间vs91vp4v1#
是否可以将比较闭包作为参数传递给需要它的每个节点操作?它将由树 Package 器拥有,而不是克隆到每个节点中。