什么是实现数据结构的正确和最生锈的方式提供"处理"它的元素?

时间:2017-03-11 14:59:07

标签: data-structures rust

实现提供"处理"的数据结构的什么是生锈的好方法。它的元素允许他们以后的操纵?一个主要的例子是binary heap实现,您希望减少元素键并删除元素。

(我的特殊动机是Fibonacci和其他堆,例如Dijkstra的算法。)

this related question不同,我不介意编写不安全的代码,只要我能提供带安全元素引用的安全接口。

我可以想到几个方向:

  • 通过某个唯一键索引数据结构的元素,并始终通过此键访问它。在堆中,这意味着一个额外的结构。这也使内部结构变得相当复杂。

  • 使用弱引用为父指针包裹Rc中的每个节点。每个"元素句柄" return实际上是一个包裹的Rc。这可以是完全安全的Rust,但我不喜欢所有运行时检查的解决方案,并且在任何地方使用refcounting都不是一个非常好的设计。

  • 返回带有生命周期绑定到主结构的引用或指针的句柄。在删除主结构之前,此选项可能不允许删除单个元素。我不确定细节或选项。

我想请求最后一个选项的帮助,或者更一般地说,如果我还缺少任何其他方法。我知道"you can not have everything" ......我在这里要求正确和最生锈的方法。

1 个答案:

答案 0 :(得分:2)

标准库中的Entry API HashMap是您第三个想法的一个很好的例子。

如果您稍微研究一下源代码,您会发现Entry的实例包含对它们来自HashMap的可变引用,以及为避免第二次冗余搜索哈希表所需的一些元数据。

由于Entry包含对其HashMap的可变引用,因此一次只能存在一个此类Entry,并且HashMap同时修改Entry 1}}存在是不可能的。这可能就是你想要的。

Rust的内置切片类型是您的第三个想法的另一个例子。不同寻常的是,split_at_mut()方法可用于获取同一数组的多个同时可变视图,前提是它们不重叠。这可能是从精心挑选的不安全代码中受益的一个很好的例子。

在我看来,这些设计运作良好,我会模仿它们。