2016-07-14 5 views
0

我々はLinkedListを持つ構造体を持っている:錆リスト要素(リスト所有者と複数の参照者)の複数の所有者 - 可能ですか?

struct XPipeline { 
    handlers: LinkedList<XHandler>, 
} 

XPipelineはすべてXHandlerオブジェクトの所有者であるし、それらにアクセスして変更することができます。

既にハンドラのリストがあります。各ハンドラがリスト内の隣人を参照できるようにする必要があります。すなわち、各ハンドラのメソッドは、ハンドラのネイバを参照し、それらを変更し、それらのメソッドを呼び出すことができます。

私の最初の考えは次のようなものでした:私はprevnextの隣人を参照するフィールドを各ハンドラに提供します。新しいハンドラをリストに追加することによって、これらのフィールドを対応する参照で初期化します。これらの参照は、すべてのハンドラのメソッド内で使用できます。 (それはポインタでC++で簡単になるでしょう)。

問題は次のとおりです。所有者は1人だけです(変更許可あり)。その所有者(すべてのハンドラの)はすでに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

あなたは*侵入型のデータ構造*を探しているようです。 – llogiq

答えて

1

データ構造内の複数のリンクに対するRustの戦略の1つは、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

関連する問題