2012-12-04 44 views
5

據我所知,unique_ptr表示獨佔所有權。單鏈表似乎符合這一點,每個節點擁有了下,像(pseduocode警報)使用unique_ptr <>實現列表?

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

,但我不知道如何執行像遍歷的列表中,我已經習慣了這樣的操作

here=here->next; 

你如何使用unique_ptr的實現數據結構的?他們是這份工作的正確工具嗎?

回答

6

當你經過的節點,你不需要把自己的節點指針,這意味着

這裏=這裏 - >下一步;

是不正確,如果這裏是一個的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'。 –

相關問題