C++ 路径查找中的指针所有权

标签 c++ containers smart-pointers

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

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

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

最佳答案

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

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

关于C++ 路径查找中的指针所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65897837/

相关文章:

c++ - 在 C++ 库中动态阻止函数的使用

c++ - 为什么我需要手动删除 vector 中的指针?

Docker如何创建容器

docker - 如何让容器在没有链接和端口映射的情况下在ECS中相互通信?

c++ - std::vector of vectors 释放其 shared_ptr 内容(堆栈实体对象的使用不正确?)

visual-c++ - COM 中 CComPtr 优于 CComQIPtr 的用途是什么?

c++ - 引用是否被视为 C++ 中的指针

docker - 在 Docker 中混合 cpu-shares 和 cpuset-cpus

c++ - 使用共享指针在两个类型模板化类之间进行转换

c++ - 我必须删除 C++ 中的静态数组吗?