![](/img/trans.png)
[英]How can I create my own data structure with an iterator that returns mutable references?
[英]How can I make a structure with internal references?
我正在尝试使用邻接列表创建一个图形,但我无法弄清楚如何为邻接列表中的引用指定适当的生命周期。
我想要得到的是以下内容:
struct Graph<T> {
nodes : Vec<T>,
adjacencies : Vec<Vec<&T>>
}
这不起作用,因为引用类型缺少生命周期说明符。 我想我可以使用索引作为邻接,但我实际上对内部参考问题感兴趣,这只是表达这个问题的工具。
我看到它的方式,应该可以安全地进行,因为节点是由对象拥有的。 应该允许它保持对这些节点的引用。
我对吗? 怎么能在Rust做到这一点? 或者,如果我错了,我错过了什么?
由于Rust的内存安全性而无法在Rust中使用引用来表示此概念 - 这样的对象在没有已存在的情况下无法构建。 只要nodes
和adjacencies
是分开存储的,就可以了,但只要你尝试将它们连接在同一个结构中,它就无法工作。
替代方案是使用引用计数(如果不可变是Rc<T>
或具有内部可变性的Rc<RefCell<T>>
)或使用不安全指针( *const T
或*mut T
)。
我认为这里有一个问题。 如果我们将它转换为C ++:
template <typename T>
struct Graph {
std::vector<T> nodes;
std::vector<std::vector<T*>> adjacencies;
};
在adjacencies
点指向nodes
,然后人们意识到存在一个问题: nodes
上的操作使引用无效(例如重新分配)会将悬空指针留给adjacencies
。
我看到至少有两种方法可以解决这个问题:
adjacencies
索引,因为它们是稳定的 nodes
使用一个间接级别,以便固定内存 在Rust中,这给出了:
struct Graph<T> {
nodes: Vec<T>,
adjacencies: Vec<Vec<uint>>,
};
struct Graph<T> {
nodes: Vec<Rc<RefCell<T>>>,
adjacencies: Vec<Vec<Rc<RefCell<T>>>>,
};
注意: RefCell
允许通过引入运行时检查来改变T
尽管它是别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.