![](/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.