2012-12-04 3 views
5

私が理解しているように、unique_ptrは排他的所有権を意味します。単独リンクリストは、(pseduocode警告)unique_ptr <>でリストを実装していますか?

class node{ 
public: 
     unique_ptr<node> next; 
     int value; 
}; 

のような、次を所有する各ノードで、これに合わせているようだが、私は私がやってに慣れてリストを横断するなどの操作を実行する方法を理解していません

here=here->next; 

unique_ptrを使用してデータ構造を実装するにはどうすればよいですか?彼らは仕事のための正しいツールですか?

答えて

6

あなたがノードを通過するとき、あなたは次の>ここ= here-その

を意味し、ノードポインタを所有する必要はありません。

ここにunique_ptrがある場合は間違っています。 オブジェクトを所有するとは、「その生死に責任がある」という意味です。つまり、オブジェクトを破壊するコードを所有しているのは所有者です。所有の別の定義を使用すると、unique_ptrの意味ではありません。

リストノードコードでは、各ノードが次のノードを担当していると仮定します(ノードを破壊すると、次のノードもすべて破棄されます)。それは有効な行動になることができます、それはあなたのニーズに応じて、それはあなたが本当に望んでいることを確認してください。

あなたが望むのは、それを所有せずにポインタを読み取ることです。これを行うための現在の良い習慣は、このコードを見ている他の開発者に「使用していますが所有していない」種類の使用法を示す生のポインタを使用することです(unique_ptrは「死んだ場合、先のオブジェクトも死ぬ」を意味します):

node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer) 
here = &first_node(); // assuming first_node() returns a reference to the first node 
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface 
+0

私はノードに次の責任を負うことを約束していません。私は生のポインタとスマートポインタの間の変換方法を理解しようとしており、これは最も直接的なようでした。代替案に関する提案はありますか? –

+1

さて、私はshared_ptrを使うのはもっと高価だが扱いが簡単だろうと思う。ノードを切り離すのは非常に簡単です。つまり、最適化されたリストの実装では、ローポインタとカスタムノードの割り当てが行われます。 – Klaim

+0

'std :: swap'について忘れないでください。 –

関連する問題