ошибка: не удалось преобразовать minHeap из std::priority_queue, std::greater › в std::priority_queue

Я новичок в С++. Я пытаюсь создать maxheap и minheap, используя std::priority_queue. Создание только maxheap работает нормально, но не то и другое. Я не могу понять ошибку. Я получаю следующую ошибку: не удалось преобразовать «minHeap» из «std::priority_queue, compare>» в «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);
    }
}

person aman9v    schedule 03.10.2017    source источник
comment
priority_queue<int, vector<int>, greater<int> > не priority_queue<int>   -  person Kevin    schedule 03.10.2017
comment
priority_queue<int, vector<int>, greater<int> > не того же типа, что и priority_queue<int>...   -  person Jarod42    schedule 03.10.2017


Ответы (2)


Вы пытаетесь передать переменную с типом 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);
}

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

person boriaz50    schedule 03.10.2017

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

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);
}
person Jarod42    schedule 03.10.2017