C++反转一个优先级队列

xqnpmsa8  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(139)

嗨,我想知道如果给定一个std::priority_queue,是否有一种方法可以将堆的顺序从最小堆改为最大堆,反之亦然?我并不是说用greater定义一个优先级队列,我的意思是我们已经有了一个包含一些元素的priority_queue。
我基本上是想打印元素在相反的顺序从优先级队列,而弹出。
现在我意识到元素可以被加载到一个堆栈中,然后从堆栈中弹出,这会改变顺序,但我想在原地完成,而不使用额外的内存,或者为此编写我自己的堆实现。
有办法吗?
示例:

std::priority_queue<int> pq{};

pq.push(1);
pq.push(2);
pq.push(3);

while(!pq.empty()){

   std::cout << pq.top();
   pq.pop(); //this would print 321, but I would simply like 123, reversed.
   //but don't change the declaration of the priority_queue. Reverse it when   it has its elements inside of it.

}
ntjbwcob

ntjbwcob1#

您已将问题标记为heap。这是一个很好的提示,为什么不用它来代替优先级队列呢?

std::vector<int> pq{};

pq.push_back(1);
pq.push_back(2);
pq.push_back(3);

// possibly first sort order
std::make_heap(pq.begin(), pq.end(), std::less<>{});

// ...

// Reorder
std::make_heap(pq.begin(), pq.end(), std::greater<>{});

while(!pq.empty()) {
  std::pop_heap(pq.begin(), pq.end(), std::greater<>{});
  std::cout << pq.back();
  pq.pop_back();
  // The loop will print 123
}

你可以在堆中改变一个比较函数,并随时重新创建它。

相关问题