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

How to delete an obj in queue during BFS (C++)?

本文关键字:删除 队列 对象 BFS C++      更新时间:2023-10-16

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

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

queue <TreeNodes*> my_queue;

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

在BFS期间,我出现了分段故障,我知道它的原因,但不知道如何解决它

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

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

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

一种可能性是在树中使用shared_ptrs,在队列中使用weak_ptrs。使用它们在某种程度上是不平凡的,但基本思想是shared_ptr拥有它所指向的东西的所有权,而weak_ptr能够观察相同的东西——但如果shared_ptr处理了对象,weak_ptr会让你知道你试图查看的东西已经消失,而不是试图使用一个现在已经过时的指针。