rust - 如何使用 BTreeSet 的自定义比较器函数?

标签 rust

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

Rust 的 BTreeSet使用 Ord对类型进行排序的特征。我不知道有什么方法可以覆盖此行为——它内置于容器存储的类型的类型约束中。

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

解决方法当然是为项目构建一个普通的旧Vec,然后对其进行排序。但在我看来,这不如在插入时自动排序那么干净。

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

最佳答案

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

struct Wrapper(Wrapped);

然后您可以定义自定义 Ord Wrapper 的实现完全符合您想要的语义。

此外,既然你有了一个newtype,你还可以很容易地实现其他traits来促进转换:

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

关于rust - 如何使用 BTreeSet 的自定义比较器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028324/

相关文章:

Rust diesel orm查询

types - 如何从usize中减去isize?

rust - 从另一个 crate 的类型上实现 std::convert::From

rust - 编译错误 : can't find crate for `core`

rust - 内置*安全*方式移出 Vec<T>?

rust - 无法编译允许将值插入其中的 OneOrMany 枚举

c++ - 如何使用 C++/Qt/CMake 项目构建 Rust 代码?

rust - 为什么 rust 应该期望()何时沸腾?

rust - 如何使用 Tokio TcpListener 处理 WouldBlock 错误?

error-handling - 如何在 Rust 的 IO 错误中包含文件路径?