如何在BTreeSet中使用自定义比较器功能?

时间:2015-12-01 19:17:39

标签: rust

在C ++中,可以自定义代码std::set用于对其参数进行排序。默认情况下,它使用std::less,但可以使用Compare模板参数进行更改。

Rust BTreeSet使用Ord特征对类型进行排序。我不知道如何覆盖这种行为 - 它内置于容器存储的类型的类型约束中。

但是,构建按照本地有用的度量标准排序的项目列表通常是有意义的,但这不是始终比较项目的最佳方式。或者,假设我想对use d类型的项进行排序;在这种情况下,即使我愿意,也不可能为类型实现Ord

解决方法当然是建立一个普通的旧Vec项目,然后sort。但在我看来,这并不像插入时自动排序那样干净。

有没有办法使用具有Rust容器类型的替代比较器?

1 个答案:

答案 0 :(得分:9)

Rust标准集合中目前不存在自定义比较器。解决问题的惯用方法是定义newtype

struct Wrapper(Wrapped);

然后,您可以使用您想要的语义为Wrapper定义自定义Ord实现。

此外,由于您有一个新类型,您还可以轻松实现其他特征以促进转换:

请注意,访问包装的实体在语法上是轻量级的,因为它只有两个字符:.0