Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;路径查找中的指针所有权_C++_Containers_Smart Pointers - Fatal编程技术网

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
将允许您的算法对指向节点的(原始的、非拥有的)指针进行操作,并且您可以在算法中调整向量大小,而不会使这些指针无效。