【问题标题】:C++ pointer ownership in path finding路径查找中的 C++ 指针所有权
【发布时间】:2021-01-26 16:21:49
【问题描述】:

我正在编写一个寻路算法,所以我有代表节点的TreeNode,但在我的算法中,我有一个open 容器,它是一个priority_queue,它允许快速检索最高优先级的节点。我还需要快速检查我是否已经探索了一个给定的节点,所以我有一个closed 容器,它是一个set

现在的问题是:谁拥有什么?我的 TreeNode 存储在哪里? openclosed 容器本身不需要存储节点,它们只需一个指向它们的指针,但是我在哪里存储节点呢?

我的想法是将weak_ptr<TreeNode> 存储在这些容器中,当我想创建一个新的TreeNode 时我使用make_shared<TreeNode>?或者我可以有一个存储所有节点的vector<TreeNode>,而其他容器只存储索引,这样我就可以避免昂贵的shared_ptr

【问题讨论】:

    标签: c++ containers smart-pointers


    【解决方案1】:

    我确实会将对象的所有权与算法本身分开。

    如果您确定在算法执行期间将拥有固定数量的节点,您可以使用预先完全创建一次的vector<TreeNode>。 然后,您可以使用指向元素或其索引的指针并对它们进行操作。 指针稍微灵活一些,因为您可以将底层存储容器更改为不连续的东西(例如std::set,甚至将它们存储在map 或其他东西中)。 然后没有额外的视觉和代码开销不必要地“污染”算法代码,所有权问题是微不足道的,这总是一件好事。

    【讨论】:

    • 但是如果我不知道搜索过程中会创建多少个节点,我该怎么办?
    • 在调整向量大小时唯一需要注意的是指向重定位元素的指针将失效。所以你仍然可以在向量的元素中使用索引(只要你不去删除元素而不更新你保留的索引)但不能使用指针。将其修改为 std::vector<unique_ptr<TreeNode>> 将允许您的算法对指向节点的(原始的、非拥有的)指针进行操作,并且您可以在算法中调整向量的大小而不会使这些指针失效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2013-03-21
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多