【问题标题】:Can I get the unique_ptr (if any) that the pointer belong to?我可以获得指针所属的 unique_ptr(如果有的话)吗?
【发布时间】:2018-06-01 04:33:32
【问题描述】:

我正在构建一棵树,其中 Node 类在左右子节点上具有 unique_ptr,并且 Node* 指针指向父节点。当我删除节点时,我使用节点并且我必须检查我要删除的节点是否在左子节点的右边,然后重置父节点中的 unique_ptr。有什么方法可以获取指针并询问是否有任何 unique_ptr 包装器围绕它并可能返回它?

【问题讨论】:

  • 您可以使用std::/enable_shared_from_this 获取一些std::shared_ptr
  • 我不太清楚你在问什么。如果删除树中的节点,则必须获取对其父节点的指针/引用,以便调整父节点的指针。这与唯一、原始和共享指针无关。通常当你实施例如RB 树,您将在每个节点中包含一个父指针 (stackoverflow.com/questions/46119328/…)。所以你可以这样做:if (this->parent->left.get() == this) { // current node is left child } else { // is right }.
  • @NirFriedman 如果我将节点作为 unique_ptr 引用进行操作,我只需要在节点上调用 reset,但现在我必须上一层并检查它是左子还是右子,即使我已经有我要删除的指针。我知道我必须调整父指针,但如果我能得到它,是否只需在 unique_ptr 参考上重置就可以解决?
  • @Davar 回答您的问题仍然有点困难,因为它过于宽泛且缺乏细节。您的问题的实际答案是,无论如何,您都需要一个父指针来处理二叉树实现中的各种事物(请阅读我的链接答案)。另一种可能性是您可以使您的iterator 类型包含指向相关节点的unique_ptr 的指针,而不是直接指向该节点。无论哪种方式,您都需要访问父持有的指针,并且没有神奇的方法可以做到这一点。请注意,弗朗索瓦关于 enable_shared_from_this 的建议也对您没有帮助。
  • @NirFriedman 是的,你是对的。

标签: c++ pointers this unique-ptr


【解决方案1】:

有什么方法可以获取指针并询问它周围是否有任何 unique_ptr 包装器并可能返回它?

没有通用的方法找到unique_ptr,但您可以例如存储参考。

假设您的树是二叉树,您可以像这样在父级中找到unique_ptr

(parent->left == this ? parent->left : parent->right).release();

如果树不是二叉树,您可以遍历所有子树。

【讨论】:

    【解决方案2】:

    在 C++ 中,指针是单向的;而unique_ptr,只是一个围绕指针的包装类,不会改变这一点。没有办法从它指向的原始指针中获取unique_ptr

    针对您的特定问题的一些替代解决方案是可能的:

    1. 添加一个 parent 指向子对象的指针,然后您可以导航到父对象以从那里删除子对象。如果您有很多节点,这可能效率低下。
    2. 实现 迭代器 的概念 - 上下文的抽象,包含足够的信息以能够修改树(例如删除节点)。例如,树迭代器可以包含指向当前节点的指针、指向其父节点的指针以及指示它是左子节点还是右子节点的标志。缺点是你不能简单地通过一个指向它的节点的指针来修改一棵树,你需要一个迭代器的实例。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多