使用std :: unique_ptr的双链表

时间:2013-03-13 11:47:57

标签: c++ unique-ptr doubly-linked-list

有人建议实施吗?前几天我在家里试过这个,发现移动语义太难建立先前的链接或简单的链表。使用std :: unique_ptr创建树很容易。当然,由于复制/分配,std :: shared_ptr可以轻松实现这个问题。那怎么样?

3 个答案:

答案 0 :(得分: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指针 - 我没有看到太多问题,所以我不要以为那就是你想要的。

如果你有一些类似“半独特列表”的东西,提供一些代码并告诉我们,你遇到的问题 - 我们很乐意帮助:)

答案 1 :(得分:0)

这是我使用的,

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

当然使用“半独特”方法,因为这是唯一可行的方法。

这样做是为了控制给定的unique_ptr,并且与列表中的项的任何交互都是用普通指针完成的。如果您从列表中提取项目,那么您将获得所有权。

基本上,它为您提供了使用智能指针自动删除的便利。当然,如果在处理其中一个对象时删除列表对象,它将会中断,在这种情况下,您需要一个shared_ptr列表。

答案 2 :(得分:0)

是的,可以通过使用任何指针(next或prev)作为unique_ptr而将另一个指针作为原始指针来完成。 参考CppCon 2016:Herb Sutter“C ++中的泄漏自由......默认情况下。” CppCon 2016: Herb Sutter “Leak-Freedom in C++... By Default.”