任何人都建議執行?我前幾天在家裏嘗試了這種方法,發現移動語義太難以建立先前的鏈接或簡單的鏈接列表。如果使用std :: unique_ptr製作樹,很容易。當然,std :: shared_ptr通過複製/分配可以很容易地實現這個問題。那麼它怎麼樣?雙向鏈接列表使用std :: unique_ptr
回答
既然問題已經重新開放,我會後我的意見是什麼,我認爲是一個答案:
如果你的意思是使用只unique_ptr
,那將是不可能的,因爲在一個雙向鏈表你指向每個元素的指針有兩個,因此它們不能同時爲unique_ptrs。 (這將在某種程度上違背獨特部分...)
爲了澄清,讓我們考慮三個元素的列表:A <-> B <-> C
這裏A
將包含一個unique_ptr next
,指着B
,因此擁有B
。 C
將有一個unique_ptr prev
,並且還有B
- 並擁有它。兩個unique_ptr
擁有相同的對象是違反unique_land的法則,並且由於unique_ptr
的移動特性,您將不得不爲此實現它。
另一種方法是在next
指針unique_ptrs
列表,而last
指針是普通的老式C-指針 - 我看不出有任何問題出現,所以我不認爲這是你想要的。
但如果你有一個像記住「半唯一列表」有些事情,提供一些代碼,並告訴我們,你有問題 - 我們會很樂意幫助:)
沒有記住一個半獨特的列表。我可以通過新的easy輕鬆使用動態內存來構建一個雙向鏈表。使用std :: shared_ptr提供一個實現也很容易。這不是問題。我沒有發佈代碼,因爲我已經嘗試在家裏沒有成功,不得不求助於std :: shared_ptr。我的問題是,如果有人知道如何僅使用std :: unique_ptr來實現雙向鏈表。我只能創建一個「半列表」解決方案,因爲我發現移動機制不足。有沒有辦法做到這一點?提供部分獨特的好答案。 – user633658 2013-03-13 15:07:42
查看我答案的第一部分。爲了澄清爲什麼我不可能擁有'unique_ptr'-only-list',我加了一段。 – 2013-03-14 07:17:40
然後這是我尋求的答案。我感謝你提供它。如果其他人認爲他們可以用std :: unique_ptr實現一個雙向鏈表,請隨時發佈一個解決方案。 – user633658 2013-03-14 12:11:01
這是我用什麼,
https://gist.github.com/mukunda-/153d802065c130e2956c
它使用的是「半獨一無二」的方法,當然,因爲這是唯一可行的辦法。
這是做什麼的,它需要控制給它的unique_ptr,並且與列表中的項目的任何交互都使用普通指針完成。如果你從列表中拉出物品,那麼你獲得所有權。
本質上,它爲您提供智能指針自動刪除的便利。當然,如果您在處理其中一個對象時刪除列表對象,那麼它會中斷,在這種情況下,您需要一個shared_ptr列表。
是的,它可以通過使用任何指針(next或prev)作爲unique_ptr和另一個作爲原始指針來完成。 請參閱CppCon 2016:Herb Sutter「C++中的泄漏自由...默認設置」。 CppCon 2016: Herb Sutter 「Leak-Freedom in C++... By Default.」
- 1. 在雙向鏈接列表中搜索
- 2. 向量的雙鏈表列指針雙向鏈接列表
- 3. 雙向鏈接列表
- 4. 使用std :: unique_ptr的雙(二維)數組
- 5. 雙向鏈接列表反向打印?
- 6. 雙向鏈接使用Normalizr
- 7. 鏈接列表和雙向鏈表列表示例
- 8. 雙向鏈接列表幫助
- 9. 打印雙向鏈接列表
- 10. 菜單項的雙向鏈接列表
- 11. 打印雙向鏈接列表
- 12. 雙向鏈接列表current.next = null
- 13. 單獨轉換爲單向鏈接列表雙向鏈接列表
- 14. 指向std :: unique_ptr的內容
- 15. 刪除雙向鏈接列表中的鏈接
- 16. 使用std鏈接錯誤::向量
- 17. 雙向鏈表
- 18. 雙向鏈表
- 19. 雙向鏈表
- 20. 雙向habtm鏈接
- 21. 在std :: unique_ptr中使用std :: bind in lambda
- 22. 試圖使用鏈接列表和向量使鄰接列表
- 23. 使用JQuery Chained插件鏈接「雙向」
- 24. 在反向打印雙向鏈接列表
- 25. 使用裝飾設計模式通過裝飾單個鏈接列表來創建雙向鏈接列表
- 26. 單向鏈表到雙向鏈表
- 27. 如何在C編程中使用雙向鏈接列表接受字符串?
- 28. 雙向鏈表C++用類
- 29. 將單個鏈接列表轉換爲雙鏈接列表
- 30. C++雙向鏈表
爲什麼大家都投票結束? – Pubby 2013-03-13 11:58:43
我投票結束,因爲我沒有看到OP的任何努力。沒有代碼發佈OP自己嘗試的內容。 – Nawaz 2013-03-13 11:59:25
@Nawaz這並不是「不是真正的問題」。我會說downvote爲「這個問題沒有顯示任何研究努力」,但是再次,第二句話說他花時間嘗試東西了。但這並不是真正的問題,爲什麼他的代碼,所以我不明白爲什麼這是相關的。 – Pubby 2013-03-13 12:05:18