Shrinking a std::priority_queue

Shrinking a std::priority_queue

本文关键字:queue priority Shrinking std      更新时间:2023-10-16

给定一个std::priority_queue,通过重复弹出最佳元素的通常过程,元素被添加到该队列的速度比删除元素的速度快,因此除非采取措施,否则程序将耗尽内存,

有没有办法扔掉最坏的一半元素,同时让最好的一半像往常一样一次处理一个?

没有直接的方法。但是二进制堆并不能真正支持这种操作。

但间接做到这一点并不难:

  • 创建临时的空优先级队列
  • 交换主队列和临时队列
  • 输入一个从临时弹出并推到主循环的循环
  • 当您对复制的元素数量感到满意时停止
  • 销毁临时队列
显然不是,因为std::priority_queue的接口非常有限。您可以使用make_heap、push_heap和pop_heap实现自己的优先级队列(std::priority_queue就是这样实现的),并实现自己的函数来删除最差的一半元素。

std::priority_queue是2-heap,因此仅为部分有序。数据结构对于以不同于提取元素的方式定位元素的最佳一半没有用处。