有人建议实施吗?前几天我在家里试过这个,发现移动语义太难建立一个先前的链接或简单的链表。如果使用 std::unique_ptr 制作树很容易。当然,由于复制/分配,std::shared_ptr 可以轻松实现这个问题。那么怎么样呢?
3 回答
由于问题已重新打开,我将发表我的评论作为我认为的答案:
如果您的意思是仅 unique_ptr
使用,那将是不可能的,因为在双向链表中,您有两个指向每个元素的指针,因此它们不能同时是 unique_ptrs。(这会以某种方式与独特的部分相矛盾......)
为了澄清,让我们考虑三个元素的列表:A <-> B <-> C
这里A
将包含 a unique_ptr next
,指向B
并因此拥有B
。C
也会有一个unique_ptr prev
,B
并且拥有它。拥有同一个对象的两个unique_ptr
s 违反了 unique_land 定律,由于unique_ptr
的只能移动属性,您必须付出邪恶的努力才能实现它。
next
另一种选择是指针所在的列表unique_ptrs
,而last
指针是普通的旧 C 指针 - 我在那里没有看到太多问题,所以我认为这不是你想要的。
但是,如果您有类似“半唯一列表”的想法,请提供一些代码并告诉我们您有什么问题 - 我们很乐意提供帮助 :)
这是我用的,
https://gist.github.com/mukunda-/153d802065c130e2956c
它当然是使用“半唯一”方法,因为这是唯一可能的方法。
它的作用是控制赋予它的 unique_ptr,并且与列表中的项目的任何交互都使用普通指针完成。如果您将某个项目从列表中拉出,那么您将获得所有权。
从本质上讲,它为您提供了使用智能指针自动删除的便利。当然,如果您在处理其中一个对象时删除列表对象,它会中断,在这种情况下,您需要一个 shared_ptr 列表。