C++\'s STL priority queue have a void pop() method, and a const ref top() method. Thus, if you want to move elements out of the queue, you have to do something like this:
This is indeed a flaw in std::priority_queue
. But you can easily extend it like this:
template <
class T,
class Container = std::vector,
class Compare = std::less>
class priority_queue : public std::priority_queue {
public:
T top_and_pop() {
std::pop_heap(c.begin(), c.end(), comp);
T value = std::move(c.back());
c.pop_back();
return value;
}
protected:
using std::priority_queue::c;
using std::priority_queue::comp;
};
(based on @nosid answer)