2013-03-13 148 views
3

任何人都建議執行?我前幾天在家裏嘗試了這種方法,發現移動語義太難以建立先前的鏈接或簡單的鏈接列表。如果使用std :: unique_ptr製作樹,很容易。當然,std :: shared_ptr通過複製/分配可以很容易地實現這個問題。那麼它怎麼樣?雙向鏈接列表使用std :: unique_ptr

+1

爲什麼大家都投票結束? – Pubby 2013-03-13 11:58:43

+0

我投票結束,因爲我沒有看到OP的任何努力。沒有代碼發佈OP自己嘗試的內容。 – Nawaz 2013-03-13 11:59:25

+0

@Nawaz這並不是「不是真正的問題」。我會說downvote爲「這個問題沒有顯示任何研究努力」,但是再次,第二句話說他花時間嘗試東西了。但這並不是真正的問題,爲什麼他的代碼,所以我不明白爲什麼這是相關的。 – Pubby 2013-03-13 12:05:18

回答

5

既然問題已經重新開放,我會後我的意見是什麼,我認爲是一個答案:

如果你的意思是使用unique_ptr,那將是不可能的,因爲在一個雙向鏈表你指向每個元素的指針有兩個,因此它們不能同時爲unique_ptrs。 (這將在某種程度上違背獨特部分...)

爲了澄清,讓我們考慮三個元素的列表:A <-> B <-> C這裏A將包含一個unique_ptr next,指着B,因此擁有BC將有一個unique_ptr prev,並且還有B - 並擁有它。兩個unique_ptr擁有相同的對象是違反unique_land的法則,並且由於unique_ptr的移動特性,您將不得不爲此實現它。

另一種方法是在next指針unique_ptrs列表,而last指針是普通的老式C-指針 - 我看不出有任何問題出現,所以我不認爲這是你想要的。

如果你有一個像記住「半唯一列表」有些事情,提供一些代碼,並告訴我們,你有問題 - 我們會很樂意幫助:)

+0

沒有記住一個半獨特的列表。我可以通過新的easy輕鬆使用動態內存來構建一個雙向鏈表。使用std :: shared_ptr提供一個實現也很容易。這不是問題。我沒有發佈代碼,因爲我已經嘗試在家裏沒有成功,不得不求助於std :: shared_ptr。我的問題是,如果有人知道如何僅使用std :: unique_ptr來實現雙向鏈表。我只能創建一個「半列表」解決方案,因爲我發現移動機制不足。有沒有辦法做到這一點?提供部分獨特的好答案。 – user633658 2013-03-13 15:07:42

+0

查看我答案的第一部分。爲了澄清爲什麼我不可能擁有'unique_ptr'-only-list',我加了一段。 – 2013-03-14 07:17:40

+0

然後這是我尋求的答案。我感謝你提供它。如果其他人認爲他們可以用std :: unique_ptr實現一個雙向鏈表,請隨時發佈一個解決方案。 – user633658 2013-03-14 12:11:01

0

這是我用什麼,

https://gist.github.com/mukunda-/153d802065c130e2956c

它使用的是「半獨一無二」的方法,當然,因爲這是唯一可行的辦法。

這是做什麼的,它需要控制給它的unique_ptr,並且與列表中的項目的任何交互都使用普通指針完成。如果你從列表中拉出物品,那麼你獲得所有權。

本質上,它爲您提供智能指針自動刪除的便利。當然,如果您在處理其中一個對象時刪除列表對象,那麼它會中斷,在這種情況下,您需要一個shared_ptr列表。