有人建议实施吗?前几天我在家里试过这个,发现移动语义太难建立先前的链接或简单的链表。使用std :: unique_ptr创建树很容易。当然,由于复制/分配,std :: shared_ptr可以轻松实现这个问题。那怎么样?
答案 0 :(得分:5)
由于问题已经重新开放,我会将评论发表为我认为的答案:
如果您的意思是仅使用 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指针 - 我没有看到太多问题,所以我不要以为那就是你想要的。
但如果你有一些类似“半独特列表”的东西,提供一些代码并告诉我们,你遇到的问题 - 我们很乐意帮助:)
答案 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.”