C++ 如何在BFS(C+;+;)期间删除队列中的对象?
我正在写一个包含BFS的程序。它将在每个节点都包含一些属性的树上执行BFS。我用链表来表示这棵树。我的代码是巨大的,我不能张贴在这里。以下是我所做工作的总结: 在BFS期间,我使用节点类型的队列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期间,我将
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是的,我得到了一些随机值,你知道避免它的任何解决方案吗?