Я пишу класс, который имеет три очереди приоритета как частные члены.
class Foo {
...
...
private:
// I am fine with using pointers instead if it helps.
std::priority_queue<int> first; // min heap.
std::priority_queue<int> second; // max heap.
std::priority_queue<int> third; // min heap.
};
Теперь мне нужно first
и third
начинать с min heaps
и second
как max heap
. В рамках функциональности моего класса мне нужно сделать следующее:
- Переместите
second
вfirst
. В идеале это достигается за счет наименьшего количества копий. Основной вектор должен просто перемещаться. Кроме того,first
теперь должен вести себя как amax heap
. - Переместите
third
вsecond
. Это означает, чтоsecond
теперь должен вести себя как amin heap
. - Так как содержимое
third
было перемещено наsecond
, оно должно быть пустым. Я хотел бы либо выделить новый базовый вектор, либо повторно использовать базовый векторfirst's
(ему это больше не нужно. Кроме того, третье должно быть теперьmax heap
.
Мне нужно выполнить этот цикл (max → min и min → max) неизвестное количество раз.
Я пытаюсь сделать это с помощью std::priority_queue
, поскольку Comparator является аргументом шаблона, что означает, что я не могу его изменить во время выполнения. Это мешает мне превратить a min heap
в max heap
.
Итак, мои вопросы:
- Есть ли способ, которым я мог бы сгибать
std::priority_queue
, чтобы сделать мои ставки, не делая его чрезвычайно уродливым? - Если нет, то могу ли я, возможно, переструктурировать мой класс, чтобы сделать то же самое, но все же использовать
std::priority_queue
? - В противном случае я мог бы повторно использовать большую часть логики
heapify
в библиотеке std для достижения этого?