C++ 使用std::unique\u ptr的双链表

C++ 使用std::unique\u ptr的双链表,c++,unique-ptr,doubly-linked-list,C++,Unique Ptr,Doubly Linked List,有人建议实施吗?前几天我在家里试过,发现移动语义太难建立一个先前的链接或一个简单的链表。如果使用std::unique\u ptr制作一棵树,那么很容易。当然,std::shared_ptr通过复制/分配可以轻松实现这个问题。那又如何呢?既然问题已经被重新打开,我将发表我的评论,我认为这是一个答案: 如果您的意思是只使用unique\u ptr,那是不可能的,因为在双链接列表中,有两个指针指向每个元素,因此它们不能都是唯一的。(这会与独特的部分产生矛盾…) 澄清,让我们考虑一个三个元素的列表:

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

既然问题已经被重新打开,我将发表我的评论,我认为这是一个答案:

如果您的意思是只使用
unique\u ptr
,那是不可能的,因为在双链接列表中,有两个指针指向每个元素,因此它们不能都是唯一的。(这会与独特的部分产生矛盾…)

澄清,让我们考虑一个三个元素的列表:<代码> A C < /COD>这里的代码> A/<代码>将包含一个<代码> UnQuyjpTr下,指向<代码> B<代码>,因此拥有<代码> B<代码>。code>C将有一个

唯一的\u ptr prev
,同时指向
B
——并拥有它。两个
unique\u ptr
s拥有同一个对象是违反unique\u land定律的,由于
unique\u ptr
的只移动属性,您必须付出邪恶的努力才能实现它

另一种方法是列出
下一个
指针是
唯一的
,而
最后一个
指针是普通的旧C指针-我没有看到太多问题,所以我认为这不是您想要的

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

以下是我使用的内容

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

它所做的是控制给定给它的惟一的_ptr,并且与列表中的项目的任何交互都是使用普通指针完成的。如果您从列表中拉出一个项目,那么您将获得所有权


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

是的,可以使用任何一个指针(下一个或上一个)作为唯一的\u ptr,另一个作为原始指针。 参考CPPCON 2016:Habor萨特“在C++中泄漏自由…默认情况下。”

为什么每个人都投票关闭?我投票关闭是因为我没有看到OP的任何努力。没有代码发布OP自己尝试的内容。@Nawaz这并不意味着这“不是一个真正的问题”。我会说downvote是因为“这个问题没有显示出任何研究成果”,但第二句话又说他花了时间尝试了一些东西。但这并不是一个关于为什么要使用他的代码的问题,所以我看不出这有什么关系。这不是一个封闭的问题,这是一个很好的问题。你的意思是只使用
unique\u ptr
?对我来说似乎不可能,因为在双链接列表中,有两个指针指向每个元素,因此它们不能同时是
唯一的\u ptr
s。另一种选择是一个列表,其中
下一个
唯一的
s,而
最后一个
是简单的旧指针-我一眼就看不出有多少问题。我没有想到一个半唯一的列表。通过新的easy,我可以使用动态内存从C指针构建一个双链接列表。使用std::shared_ptr提供实现也很容易。这不是问题所在。我没有发布代码,因为我已经在家尝试了,但没有成功,不得不求助于std::shared\u ptr。我的问题是,是否有人知道如何仅使用std::unique\u ptr实现双链接列表。我只能创建一个“半列表”解决方案,因为我发现移动机制不足。有办法做到这一点吗?提供部分唯一性的好答案。请参阅我答案的第一部分。我在一个段落中解释了为什么不可能有一个
唯一的\u ptr
-only-list。这就是我寻求的答案。谢谢你提供的。如果其他人认为他们可以用std::unique\u ptr实现双链接列表,请随时发布解决方案。如果我们想添加虚拟节点,该怎么办?从最后一个节点到头部,我们在虚拟节点上有唯一的\u ptr-看起来不太好。@Gusev Slava您想在哪里添加虚拟节点?你能提供一些代码来说明这个问题吗?