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

Rust's BTreeSet使用Ord特征对类型进行排序.我不知道有什么方法可以重写这种行为——它内置在容器存储的类型的类型约束中.

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

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

有没有一种方法可以使用Rust容器类型的替代比较器?

推荐答案

Rust标准系列中目前不存在自定义比较器.解决这个问题的惯用方法是定义newtype:

struct Wrapper(Wrapped);

然后,您可以使用所需的语义为Wrapper定义一个定制的Ord实现.

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

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

Rust相关问答推荐

如何定义使用拥有的字符串并返回拥有的Split的Rust函数?

阻止websocket中断的中断中断的终端(操作系统错误4)

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

在UdpSocket上使用sendto时的隐式套接字绑定

如何在递归数据 struct 中移动所有权时变异引用?

在文件链实施中绕过borrow 判断器

如何在Rust中基于字符串 Select struct ?

Rust ndarray:如何从索引中 Select 数组的行

为什么 `Deref` 没有在 `Cell` 上实现?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

RUST 中的读写器锁定模式

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

如何在 Rust 中将 bson::Bson 转换为 Vec

为什么1..=100返回一个范围而不是一个整数?

如何将切片推入数组?

如何为枚举中的单个或多个值返回迭代器

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?