我正在编写一个路径查找算法,所以我有 TreeNode
代表节点,但在我的算法中,我有一个 open
容器是 priority_queue
,这允许快速检索最高优先级节点。我还需要快速检查我是否已经探索了给定节点,因此我有一个 closed
容器是 set
.
现在的问题是:谁拥有什么?我的 TreeNode 存储在哪里? open
和closed
容器不需要存储节点本身,它们只需一个指向它们的指针即可,但是我在哪里存储节点呢?
我的想法是存储在这些容器中weak_ptr<TreeNode>
当我想创建一个新的 TreeNode 时,我使用 make_shared<TreeNode>
?或者我可以要一个vector<TreeNode>
存储所有节点,其他容器仅存储索引,因此我避免了昂贵的 shared_ptr
?
最佳答案
我确实会将对象的所有权与算法本身分开。
如果您确定在算法执行期间您将拥有固定数量的节点,则可以使用 vector<TreeNode>
它是预先、完全、一次性创建的。
然后,您可以使用指向元素或其索引的指针并对它们进行操作。
指针稍微灵活一些,因为您可以将底层存储容器更改为不连续的容器(例如 std::set
,甚至将它们存储在 map
或完全其他的容器中)。
这样就没有额外的视觉和代码开销不必要地“污染”算法代码,并且所有权问题也微不足道,这总是一件好事。
关于C++ 路径查找中的指针所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65897837/