当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在BTreeSet中使用自定义比较器功能?》经验,为你挑选了1个好方法。

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

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

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

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

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



1> Matthieu M...:

Rust标准集合中目前不存在自定义比较器.解决问题的惯用方法是定义一个NEWTYPE:

struct Wrapper(Wrapped);

然后,您可以使用所需的语义定义自定义Ord实现Wrapper.

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

convert::From可以实现,convert::Into免费给你

ops::Deref 可以实现,减少由于auto-deref导致的映射需求

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


大!现在您提到了各种特征,从类型的角度来看,这可能最终会比C++的方法更清晰.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有