4

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

4

3 回答 3

6

由于问题已重新打开,我将发表我的评论作为我认为的答案:

如果您的意思是 unique_ptr使用,那将是不可能的,因为在双向链表中,您有两个指向每个元素的指针,因此它们不能同时是 unique_ptrs。(这会以某种方式与独特的部分相矛盾......)

为了澄清,让我们考虑三个元素的列表:A <-> B <-> C这里A将包含 a unique_ptr next,指向B并因此拥有BC也会有一个unique_ptr prev,B并且拥有它。拥有同一个对象的两个unique_ptrs 违反了 unique_land 定律,由于unique_ptr的只能移动属性,您必须付出邪恶的努力才能实现它。

next另一种选择是指针所在的列表unique_ptrs,而last指针是普通的旧 C 指针 - 我在那里没有看到太多问题,所以我认为这不是你想要的。

但是,如果您有类似“半唯一列表”的想法,请提供一些代码并告诉我们您有什么问题 - 我们很乐意提供帮助 :)

于 2013-03-13T13:39:47.123 回答
0

这是我用的,

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

它当然是使用“半唯一”方法,因为这是唯一可能的方法。

它的作用是控制赋予它的 unique_ptr,并且与列表中的项目的任何交互都使用普通指针完成。如果您将某个项目从列表中拉出,那么您将获得所有权。

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

于 2014-11-18T23:25:58.150 回答
0
于 2017-02-20T04:13:06.027 回答