Rust:double linked list

anhgbhbe  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(102)

我是Rust的初学者。所以答案很简单。
我试着写一些可以简化为双向链表的东西。在其他语言中,我会使用一个指向两个邻居的指针结构。我可以遍历它并保存一些数据。但如何解决它在生 rust ?我会有两个可写的引用到每个节点,据我所知,这是不可能的。

3phpmpom

3phpmpom1#

Rust并不是实现链表的理想语言。在设计上没有唯一的所有权,所以Rust的类型系统会有一点困难。
我想这更像是一个学习的东西,而不是一些富有成效的东西,在这种情况下,你应该考虑链表的替代品。
你可以使用Rc<Cell<Node>>来实现。
Rc允许您通过引用计数来拥有多个所有者。Cell允许您更改Node,即使存在活动引用。

mv1qrgav

mv1qrgav2#


的数据
Rust所有权规则规定,每个值一次只能有一个所有者。但在双向链表中,每个节点将有两个所有者。我们使用Rc smart pointer

use std::rc::Rc;

字符串
为了支持多重所有权,Rust有一个名为Rc的类型。它的名字是引用计数的缩写,它跟踪对某个值的引用数量,以了解该值是否仍在使用。如果对某个值的引用为零,则可以清除该值,而不会使任何引用变为无效。
但问题是Rc指针所拥有的值是不可变的。它是只读。您可能需要修改每个节点。这就是为什么您需要使用RefCell

use std::cell::RefCell;


也就是说,你可以在Rust中使用struct创建一个双向链表。

struct List<T>{
    head:Pointer<T>,
    tail:Pointer<T>
}

struct Node<T>{
    element:T,
    next:Pointer<T>,
    prev:Pointer<T>,
}
// you need multiple owners who can mutate the data
// type is option because last_node.next will be Null
type Pointer<T>=Option<Rc<RefCell<Node<T>>>>;

1sbrub3j

1sbrub3j3#

有一个关于如何做https://rust-unofficial.github.io/too-many-lists/sixth-final.html的链接
它使用unsafe,但unsafe是必需的,因为安全版本https://rust-unofficial.github.io/too-many-lists/fourth-final.html使用RefCell,这增加了运行时检查,并且不能像unsafe版本那样性能好。请注意,我们可以避免运行时检查,因为我们可以证明unsafe代码的安全性,并且对于API消费者来说,所有公共方法都是安全的。
一般来说,当Rust的安全特性阻止你做某些事情时,使用unsafe特性并编写Rust代码~相同(与射击你的腿相同,就像在C中一样,但性能与C一样)作为C++。这样,当静态分析器可以帮助您自动执行安全检查时,您将拥有尽可能安全的代码(比任何其他编程语言都安全,包括垃圾收集的代码),当静态分析器不足以处理某些情况时,您的代码与C中的代码相同(与C中的相同,但与C++中的性能相同)

相关问题