数据结构 – 实现为其元素提供“句柄”的数据结构的正确和最生锈的方法是什么?

什么是一个很好的Rusty方法来实现一个数据结构,为其元素提供“句柄”以允许它们以后的操作?一个主要的例子是
binary heap实现,你想要减少元素键和删除元素.

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

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

我可以想到几个方向:

>通过某个唯一键索引数据结构的元素,并始终通过此键访问它.在堆中,这意味着一个额外的结构.这也使内部结构变得相当复杂.
>使用弱引用为父指针包装Rc中的每个节点.返回的每个“元素句柄”实际上都是一个包装的Rc.这可以是完全安全的Rust,但我不喜欢所有运行时检查的解决方案,并且在任何地方使用refcounting都不是一个非常好的设计.
>返回具有生命周期绑定到主结构的引用或指针的句柄.在删除主结构之前,此选项可能不允许删除单个元素.我不确定细节或选项.

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

最佳答案 标准库中
Entry API
Entry API是您第三个想法的一个很好的例子.

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

因为Entry包含对其HashMap的可变引用,所以一次只能存在一个这样的Entry,并且在Entry存在的情况下同时修改HashMap是不可能的.这可能就是你想要的.

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

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

点赞