Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 如何在BFS(C+;+;)期间删除队列中的对象?_C++_Linked List_Tree_Breadth First Search - Fatal编程技术网

C++ 如何在BFS(C+;+;)期间删除队列中的对象?

C++ 如何在BFS(C+;+;)期间删除队列中的对象?,c++,linked-list,tree,breadth-first-search,C++,Linked List,Tree,Breadth First Search,我正在写一个包含BFS的程序。它将在每个节点都包含一些属性的树上执行BFS。我用链表来表示这棵树。我的代码是巨大的,我不能张贴在这里。以下是我所做工作的总结: 在BFS期间,我使用节点类型的队列 queue <TreeNodes*> my_queue; queue my_queue; 和通常的BFS一样,我推送并弹出队列中的节点。在BFS期间,我需要更新树,这意味着我可能会删除一些节点并更新树 在BFS期间,我发生了分段故障,我知道其原因,但不确定如何解决 假设在BFS期间,我将

我正在写一个包含BFS的程序。它将在每个节点都包含一些属性的树上执行BFS。我用链表来表示这棵树。我的代码是巨大的,我不能张贴在这里。以下是我所做工作的总结:

在BFS期间,我使用节点类型的队列

queue <TreeNodes*> my_queue;
queue my_queue;
和通常的BFS一样,我推送并弹出队列中的节点。在BFS期间,我需要更新树,这意味着我可能会删除一些节点并更新树

在BFS期间,我发生了分段故障,我知道其原因,但不确定如何解决

假设在BFS期间,我将节点“x”推入队列。然后在下一次迭代中,当我弹出节点“y”时,我可能会删除节点“x”,而它仍然在队列中。一旦我弹出“x”,这就成了一个问题

最初,我认为如果我通过树中的指针删除这个节点,它也会自动将其从队列中删除。但似乎一旦我将一个节点推送到队列中,它就会推送它的一个副本。我不确定如何从队列中删除它,或者至少从树中删除一次,使其为空。因为它实际上不是空的,不指向任何地方,并且有一些随机数作为它的属性


我不知道我应该搜索什么,所以我在这里问它

一种可能是在树中使用
共享ptr
s,在队列中使用
弱ptr
s。使用它们有点不平凡,但基本思想是
共享ptr
拥有它指向的东西的所有权,
弱ptr
提供了观察相同事物的能力——但是如果
共享ptr
处理了对象,
弱\u ptr
将让您知道您试图查看的内容已消失,而不是尝试使用现在已过时的指针。

一种可能是在树中使用
共享\u ptr
s,在队列中使用
弱\u ptr
s。使用它们有点不平凡,但基本思想是
共享ptr
拥有它指向的东西的所有权,
弱ptr
提供了观察相同事物的能力——但是如果
共享ptr
处理了对象,
弱\u ptr
将让您知道您试图查看的内容已消失,而不是试图使用现在已过时的指针。

您的问题在于数据结构的选择。是的,队列是宽度遍历的炸药,但队列的关键是事情只能以一种方式进行,而只能以另一种方式进行。通常不允许内部节点访问(或者是必需的,因为您已经知道它是一个队列,如果您需要其他东西,就不会使用它)。@WhozCraig您是对的。现在我的问题是,它是否将节点的副本添加到队列中?或者它推送节点的地址?(我在问题中添加了我的队列)@Sarah:问题显示了一个指针队列,因此可以容纳指针(地址)。但是,销毁它指向的对象会留下一个陈旧的指针,因此尝试取消引用该指针会产生未定义的行为——很可能包括获取已删除对象中的值(例如,如果该内存尚未用于任何其他用途)。@JerryCoffin是的,我得到了一些随机值,您知道避免这种情况的解决方案吗?您的问题在于数据结构的选择。是的,队列是宽度遍历的炸药,但队列的关键是事情只能以一种方式进行,而只能以另一种方式进行。通常不允许内部节点访问(或者是必需的,因为您已经知道它是一个队列,如果您需要其他东西,就不会使用它)。@WhozCraig您是对的。现在我的问题是,它是否将节点的副本添加到队列中?或者它推送节点的地址?(我在问题中添加了我的队列)@Sarah:问题显示了一个指针队列,因此可以容纳指针(地址)。然而,破坏它指向的东西会留下一个陈旧的指针,因此尝试取消引用该指针会产生未定义的行为——很可能包括获取已删除对象中的值(例如,如果该内存还没有用于任何其他用途)。@JerryCoffin是的,我得到了一些随机值,你知道避免它的任何解决方案吗?