如何使用运行时定义的比较器定义有序映射/集?

2023-11-23

这类似于如何将自定义比较器函数与 BTreeSet 一起使用?但是就我而言,直到运行时我才会知道排序标准。可能的标准很广泛并且不能被硬编码(想想像按到目标的距离排序 or 按有效负载中的特定字节排序或其组合)。创建地图/集合后,排序标准不会更改。

我看到的唯一替代方案是:

  • use a Vec,但是 log(n) 插入和删除至关重要
  • 用排序标准(直接或间接)包装每个元素,但这似乎很浪费

这可以通过标准 C++ 容器实现std::map/std::set但 Rust 似乎不可能BTreeMap/BTreeSet。标准库或其他板条箱中是否有替代方案可以做到这一点?或者我必须自己实施这个?


我的用例是一个类似数据库的系统,其中集合中的元素由模式定义,例如:

Element {
    FIELD x: f32
    FIELD y: f32
    FIELD z: i64

    ORDERBY z
}

但由于模式是用户在运行时定义的,因此元素存储在一组字节中(BTreeSet<Vec<u8>>)。同样,元素的顺序是用户定义的。所以我会给比较器BTreeSet看起来像|a, b| schema.cmp(a, b)。硬编码后,上面的示例可能类似于:

fn cmp(a: &Vec<u8>, b: &Vec<u8>) -> Ordering {
    let a_field = self.get_field(a, 2).as_i64();
    let b_field = self.get_field(b, 2).as_i64();
    a_field.cmp(b_field)
}

是否可以将比较器闭包作为参数传递给需要它的每个节点操作?它将由树包装器拥有,而不是在每个节点中克隆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用运行时定义的比较器定义有序映射/集? 的相关文章

随机推荐

  • 在android中实现徒手裁剪

    我正在尝试使用画布在 Android 中实现徒手裁剪 我用drawPath并将其存储在列表中并将其绘制在画布路径绘图中 像这样 但现在我想用这段代码使该路径中的所有像素都位于侧面区域 但我不知道该怎么做 public Bitmap getB
  • 文件上传作为带有其他字段的表单的一部分

    我有一个 ASP NET MVC 网站 我需要一个页面 用户必须在其中输入多个字段 包括图像文件 我可以找到很多很多使用 MVC 上传文件的参考资料 但他们不会将文件作为包含其他字段的表单的一部分上传 理想情况下 字段和文件将发送到单个控制
  • 单击启动器图标时恢复上次活动

    正如我所看到的 当单击启动器图标时 大多数应用程序都会恢复上次活动 然而 这似乎不是默认行为 在我的应用程序启动器活动中 单击启动器图标时总是启动 当单击启动器图标并且应用程序已经运行时 如何配置我的应用程序以恢复上次活动 Problem
  • python 检查序列中的位是真还是假

    我想知道序列中的某个位是 1 还是 0 真或假 如果我有 11010011 的一些子序列 我如何检查第四个位置是 True 还是 False example 10010101 4th bit gt False 10010101 3rd bi
  • 为派生类提供模板专业化的最简单方法

    我有以下场景 class my base class my derived public my base template
  • Collections.binarySearch() 与 List indexOf()

    我有超过 37K 项的列表 并且我已经实施了hashCode equals 所以我想知道Collections binarySearch 可以帮助提高性能并且比indexOf method 如果您的收藏已排序 binarySearch 将是
  • JavaScript 中的双感叹号运算符和 Boolean() 有什么区别? [复制]

    这个问题在这里已经有答案了 我知道 variable将变量转换为布尔值和函数Boolean 根据 ecma262 规范 还将通过调用执行类型转换ToBoolean value 我的问题是 有什么区别 是 性能比 Boolean 更好 它们是
  • 我是否必须在每个页面添加“<%@ Register assembly=”?

    我升级了 DevExpress 组件 但在我的应用程序中我必须更改每个组件 是的 看http we
  • C# 中的静态类

    在回答这个问题时 https stackoverflow com questions 352317 c coding question 352327 这让我想知道 将静态类视为等同于实现单例模式的非静态类实例是否存在任何危险 对我来说唯一显
  • 控件的自定义设计器

    我有一个派生自 SplitContainer 的自定义类 namespace Builder Components public partial class ProjectSidebar SplitContainer public Proj
  • 获取画布中的鼠标位置[重复]

    这个问题在这里已经有答案了 有没有办法获得鼠标的位置
  • C 中的完美数

    我需要编写一个 C 程序来找到完美数 main int n 1000 sum 0 for int num 1 num lt n num sum 0 for int i 1 i lt num i if num i sum i if sum n
  • 如何在 Windows 中的 git-bash 中执行位于带空格的文件夹(即“Program Files”)中的命令?

    当我使用 git bash 时 我有时想调用我的命令 PATH 实际上在我的 PATH 但如果 该命令位于包含空格的文件夹中的某个位置 则它将无法运行 例如 如果程序打开C Program Files whatever aCmd exe我输
  • 动态增加java堆空间

    我编写了一个 java 程序 用于测试具有不同数量处理器的不同机器上的几个多线程算法的速度 在某些机器上 合并排序 会失败 因为它需要相当大的堆空间才能处理非常大的数组 我可以在运行程序之前轻松地自己更改 java 堆空间 但我觉得更健壮且
  • 泛型类的类对象(java)

    java中有没有一种方法可以获取类似的实例Class
  • 如何在 Java Swing 中创建窗口关闭处理程序

    我试图在我的窗口 使用 Java Swing 创建的 关闭时调用一个函数来进行清理 在我的初始化代码中我这样做 public class FormLogin extends JFrame private void initComponent
  • 为什么@RequestMapping注解在java中接受String参数,但在scala中不接受?

    阅读 RequestMapping文档 http static springsource org spring docs 2 5 x api org springframework web bind annotation RequestMa
  • Eclipse 内容辅助错误

    最近 我在 Eclipse 中的内容辅助方面遇到了越来越多的问题 在我的一些项目中 我没有从内容协助中得到任何建议 而在其他项目中 我得到了部分或全部预期的建议 通常 Eclipse 中不会出现 错误 但下面是我收到错误时的一个示例 内容辅
  • Pandas - 根据条件重复行

    如果该行满足条件 我试图创建一个重复的行 在下表中 我根据 groupby 创建了累积计数 然后对 groupby 的 MAX 进行了另一个计算 df PathID df groupby DateCompleted cumcount 1 d
  • 如何使用运行时定义的比较器定义有序映射/集?

    这类似于如何将自定义比较器函数与 BTreeSet 一起使用 但是就我而言 直到运行时我才会知道排序标准 可能的标准很广泛并且不能被硬编码 想想像按到目标的距离排序 or 按有效负载中的特定字节排序或其组合 创建地图 集合后 排序标准不会更