Я пишу класс, который имеет три очереди приоритета как частные члены.
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 для достижения этого?