如果我有一个structs的STL priority_queue,其中优先级基于该结构的某个属性,并且我更改了其中一个结构的属性,这样新的顺序就会不同,那么优先级队列是否知道求助于自己?或者我必须将它从队列中移除并再次推入?我在某处读到排序是在调用push()和pop()时完成的,但我想确定一下。
priority_queue
push()
和pop()
成员函数是根据push_heap()
和pop_heap()
库函数的行为定义的,基础容器的全部内容作为范围传入。
这些函数要求范围(push_heap()
上容器中的最后一个项除外,因为它是要添加的项)“应该是一个有效的堆”。如果您修改包含的元素,使容器不再是有效的堆,那么您将得到未定义的行为。
因此,如果您需要以这种方式修改一个元素,您需要通过移除它,修改它,然后再添加它。或者,您可以将内容弄乱,然后调用make_heap()
来重建堆。
参见C++11 23.6.4.3“priority_queue members”、25.4.6.1“push_heap”和25.4.6.2“pop_heap”。
一般来说,如果我理解正确的话,在给定列表和添加每个元素之间的“heapizing;o(n)”运行时是有区别的;o(lg n)。java遵循这种行为吗?如果不是,下面的问题可能无效。 下面的示例似乎创建了一个"min-heap"。 然而,假设我想构建一个“最大堆”,但是构造函数不允许我同时传入集合和比较器。在这种情况下,构建最大堆的唯一方法是创建一个实现可比的包装器类吗? 注意:我知道可以用比较器创
问题内容: 简而言之,我正在实现一个图形,现在正在研究Kruskal,我需要一个优先级队列。我对优先级队列的定义是,具有最小密钥的元素将排在最前面?错了吗 因为当我在队列中插入加权边(或数字)时,它们不会最终排序。 那会打印出来;[1、54、51、102、99、55]。这不是我希望他们成为的那样!是的,我制作了一个进入优先级队列的编译器,该队列从边缘对象中提取数字并根据该int进行比较。因此,这应
问题内容: 在Python文档中, 最低值的条目首先被检索(最低值的条目是由返回的条目)。条目的典型模式是形式为的元组。 看来队列将按优先级排序,然后按数据排序,这可能并不总是正确的。假设数据“项目2”在“项目1”之前入队,则项目1仍将排在第一位。在另一个文档页面heapq中,它建议使用计数器。所以我将数据存储为。是否没有类似的东西 那我就不需要自己执行订购吗? 问题答案: 据我所知,您要找的东西
注意:我知道可以用比较器创建优先级队列,然后重复调用Add。