ошибка: не удалось преобразовать «minHeap» из «std :: priority_queue, std :: большее & gt;» в «std :: priority_queue»

Я новичок в C ++. Я пытаюсь создать maxheap и minheap, используя std :: priority_queue. Создание только maxheap работает нормально, но не одновременно. Я не могу понять ошибку. Я получаю следующую ошибку:
не удалось преобразовать minHeap из std :: priority_queue, сравнить> в std :: priority_queue
Пробовал искать в интернете но безрезультатно. Ниже приведен код.

void addNum(int num, priority_queue<int> maxHeap, priority_queue<int> minHeap) {
if (minHeap.size() == 0 || num > minHeap.top())
minHeap.push(num);
else if (num < minHeap.top())
maxHeap.push(num);
}

void createHeaps(vector<int> a) {
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int> > minHeap;
for (int i = 0; i < a.size(); ++i) {
int num = a[i];
addNum(num, maxHeap, minHeap);
}
}

0

Решение

Вы пытаетесь передать переменную с priority_queue<int, vector<int>, greater<int> > типа, но ваша функция ожидает priority_queue<int> тип.

Исправьте прототип функции:

void addNum(int num, priority_queue<int>& maxHeap, priority_queue<int, vector<int>, greater<int> >& minHeap) {
if (minHeap.size() == 0 || num > minHeap.top())
minHeap.push(num);
else if (num < minHeap.top())
maxHeap.push(num);
}

Вы должны использовать ссылки. Это потому, что вам нужно изменить оригинальные коллекции.

2

Другие решения

Вы также должны использовать правильный тип для вашего метода:

void addNum(int num,
priority_queue<int, >& maxHeap,
priority_queue<int, std::vector<int>, std::greater<int>>& minHeap) {
if (minHeap.size() == 0 || num > minHeap.top())
minHeap.push(num);
else if (num < minHeap.top())
maxHeap.push(num);
}

Или вы можете шаблон вашего метода, чтобы быть более общим

template <typename ... Ts1, typename ... Ts2>
void addNum(int num,
priority_queue<int, Ts1...>& maxHeap,
priority_queue<int, Ts2...>& minHeap) {
if (minHeap.size() == 0 || num > minHeap.top())
minHeap.push(num);
else if (num < minHeap.top())
maxHeap.push(num);
}

или даже просто:

template <typename PriorityQueue1, typename PriorityQueue2>
void addNum(int num,
PriorityQueue1& maxHeap,
PriorityQueue2& minHeap) {
if (minHeap.size() == 0 || num > minHeap.top())
minHeap.push(num);
else if (num < minHeap.top())
maxHeap.push(num);
}
1

По вопросам рекламы [email protected]