在C++中,可以自定义代码std::set
用于对其参数进行排序.默认情况下它使用std::less
,但可以使用Compare
模板参数更改.
Rust BTreeSet
使用Ord
特征对类型进行排序.我不知道如何覆盖这种行为 - 它构建在容器存储的类型的类型约束中.
但是,构建一个按一些本地有用的度量标准排序的项目列表通常是有意义的,但这并不是始终比较项目的最佳方式.或者,假设我想对use
d类型的项目进行排序; 在这种情况下,Ord
即使我愿意,也不可能为类型实现自己.
解决方法当然是建立一个简单的旧Vec
项目,然后是sort
它.但在我看来,这并不像插入时自动排序那样干净.
有没有办法使用Rust的容器类型的替代比较器?
Rust标准集合中目前不存在自定义比较器.解决问题的惯用方法是定义一个NEWTYPE:
struct Wrapper(Wrapped);
然后,您可以使用所需的语义定义自定义Ord
实现Wrapper
.
此外,由于您有一个新类型,您还可以轻松实现其他特征以促进转换:
convert::From
可以实现,convert::Into
免费给你
ops::Deref
可以实现,减少由于auto-deref导致的映射需求
请注意,访问包装的实体在语法上是轻量级的,因为它只有两个字符:.0
.