C++ C++;路径查找中的指针所有权
我正在编写一个路径查找算法,因此我有一个表示节点的C++ C++;路径查找中的指针所有权,c++,containers,smart-pointers,C++,Containers,Smart Pointers,我正在编写一个路径查找算法,因此我有一个表示节点的TreeNode,但在我的算法中,我有一个open容器,它是一个priority\u队列,允许快速检索最高优先级的节点。我还需要快速检查是否已经浏览了给定的节点,因此我有一个关闭的容器,它是集合 现在的问题是:谁拥有什么?我的TreeNodes存储在哪里?open和closed容器本身不需要存储节点,它们可以有一个指向它们的指针,但是我应该在哪里存储节点呢 我的想法是在这些容器中存储weak\u ptr,当我想创建一个新的树节点时,我使用make
TreeNode
,但在我的算法中,我有一个open
容器,它是一个priority\u队列
,允许快速检索最高优先级的节点。我还需要快速检查是否已经浏览了给定的节点,因此我有一个关闭的容器,它是集合
现在的问题是:谁拥有什么?我的TreeNodes存储在哪里?open
和closed
容器本身不需要存储节点,它们可以有一个指向它们的指针,但是我应该在哪里存储节点呢
我的想法是在这些容器中存储weak\u ptr
,当我想创建一个新的树节点时,我使用make\u shared
?或者我可以有一个存储所有节点的向量
,而其他容器只存储索引,这样我就避免了昂贵的共享\u ptr
?我确实会将对象的所有权与算法本身分离
如果您确实知道在算法执行期间将有固定数量的节点,您可以使用向量
,该向量预先创建一次。
然后,您可以使用指向元素或其索引的指针并对其进行操作。
指针稍微灵活一些,因为这样您可以将底层存储容器更改为非连续的内容(例如,std::set
,甚至可以将它们存储在映射
或其他完全不同的内容中)。
这样就不会有额外的视觉和代码开销不必要地“污染”算法代码,所有权问题也很简单,这总是一件好事。但是如果我不知道搜索过程中将创建多少节点,我该怎么办?调整向量大小时唯一要注意的是指向重新定位元素的指针将无效。因此,您仍然可以在向量的元素中使用索引(只要不删除元素而不更新保留的索引),但不能使用指针。将其修改为std::vector
将允许您的算法对指向节点的(原始的、非拥有的)指针进行操作,并且您可以在算法中调整向量大小,而不会使这些指针无效。