当前位置: 首页 > 知识库问答 >
问题:

STL优先级队列:何时/如何发生重置?

仲璞瑜
2023-03-14

如果我有一个structs的STL priority_queue,其中优先级基于该结构的某个属性,并且我更改了其中一个结构的属性,这样新的顺序就会不同,那么优先级队列是否知道求助于自己?或者我必须将它从队列中移除并再次推入?我在某处读到排序是在调用push()和pop()时完成的,但我想确定一下。

共有1个答案

杨曜瑞
2023-03-14

priority_queuepush()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。