2016-07-14 53 views
0

我們有一個LinkedList一個結構:Rust列表元素(列表所有者和多個引用者)的多個所有者 - 可能嗎?

struct XPipeline { 
    handlers: LinkedList<XHandler>, 
} 

XPipeline是所有XHandler對象的所有者,並可以訪問和修改它們。

我們已經有處理程序列表;現在我們需要每個處理程序都可以引用列表中的鄰居。也就是說,每個處理程序的方法可以引用處理程序的鄰居,修改它們並調用它們的方法。

我的第一個想法是這樣的:我提供每個處理程序與prevnext字段,將引用鄰居。通過在列表中添加新的處理程序,我用相應的引用初始化這些字段。現在我可以在所有處理程序的方法中使用這些引用。 (這在使用指針的C++中很容易實現)。

問題是:只允許一個所有者(即具有修改權限)。並且該所有者(所有處理者)已經是XPipeline對象。我怎麼解決它?也許,通過採用:

handlers: Rc<RefCell<LinkedList<XHandler>>> 

但究竟如何?

+3

在問這個問題之前,請[編輯]你的問題到[顯示你進行的研究](http://meta.stackoverflow.com/q/261592/155423)。當你問這個問題時,[tag:rust]問題的首頁有[另一個圓形鏈表問題](http://stackoverflow.com/q/38353845/155423);這有什麼不同?那麼[50左右的其他鐵鏽鏈表問題](http://stackoverflow.com/search?q=%5Brust%5D+linked+list+is%3Aq);也許其中一些會有用?一旦我們知道了所有現有答案的混淆,我們可以爲您的獨特問題提供有用的答案。 – Shepmaster

+0

我已通過提供的鏈接進行搜索,未找到答案。所有的問題都是關於其他主題的。例如,[另一個循環鏈表問題](http://stackoverflow.com/questions/38353845/unable-to-create-a-circular-linked-list-in-safe-rust-unsafe-version-crashes)是關於用一種迭代器實現一個列表的。我問的是:我有一個標準的通用LinkedList +每個元素都可以直接引用它的鄰居(所以它是一種雙向雙向列表)。 –

+0

這聽起來像你正在尋找一個* intrusive數據結構*。 – llogiq

回答

1

Rust中用於數據結構中多個鏈接的策略之一是使用Vec<T>作爲後備存儲,然後使用usize「指針」將其編入索引。

你的情況看起來是這樣的:

struct XPipeline { 
    head: usize, 
    storage: Vec<Node>, 
} 

struct Node { 
    handler: XHandler, 
    next: Option<usize>, 
    prev: Option<usize>, 
} 

簿記非常相似,你會用C++使用的指針。

另請參閱this discussion on Reddit瞭解如何處理類圖結構中的所有權問題。

我也只是尋找實現雙鏈表,跳過列表,圖表或類似的箱子,並從那裏獲得靈感。

+0

也查看[鏈接列表書籍](http://cglab.ca/~abeinges/blah/too-many-lists/book/README.html) – apopiak

相關問題