在C++中,可以自定义代码std::set
用于对其参数进行排序。默认情况下它使用 std::less
, 但这可以用 Compare
改变模板参数。
Rust 的 BTreeSet
使用 Ord
对类型进行排序的特征。我不知道有什么方法可以覆盖此行为——它内置于容器存储的类型的类型约束中。
但是,构建一个按一些本地有用的指标排序的项目列表通常是有意义的,但这并不是始终比较项目的最佳方式。或者,假设我想对 use
d 类型的项目进行排序;在这种情况下,即使我想自己实现 Ord
也是不可能的。
解决方法当然是为项目构建一个普通的旧Vec
,然后对其进行排序
。但在我看来,这不如在插入时自动排序那么干净。
有没有办法对 Rust 的容器类型使用替代比较器?
最佳答案
Rust 标准集合中目前不存在自定义比较器。解决这个问题的惯用方法是定义一个 newtype :
struct Wrapper(Wrapped);
然后您可以定义自定义 Ord
Wrapper
的实现完全符合您想要的语义。
此外,既然你有了一个newtype,你还可以很容易地实现其他traits来促进转换:
-
convert::From
可以实现,给你convert::Into
免费 -
ops::Deref<Target = Wrapped>
可以实现,减少了由于自动取消引用而对映射的需求
请注意,访问包装实体在语法上是轻量级的,因为它只有两个字符:.0
.
关于rust - 如何使用 BTreeSet 的自定义比较器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028324/