Аномалия в пользовательской сортировке очереди приоритетов в C++

Я просмотрел пару статей StackOverflow и Codeforces о пользовательских очередях приоритета сортировки в C++. По умолчанию реализация C++ - это MaxHeap, поэтому элементы будут выводиться в порядке убывания. Я незначительно доработал добавление greater<int>будет всплывать по возрастанию. Я попробовал это, используя свою собственную функцию компаратора, как показано ниже:

      #include<bits/stdc++.h>
using namespace std;
class comp{
    public:
bool operator()(const int &a,const int &b){
        return a>b;
    }
};
int main(){
    priority_queue<int,vector<int>,comp> pq;
    pq.push(5);
    pq.push(1);
    pq.push(8);
    while(!pq.empty()){
        cout<<pq.top()<<" ";
        pq.pop();
    }
    return 0;
}

Это дает ожидаемый результат: 1 5 8

Но если я изменю это на:

      #include<bits/stdc++.h>
using namespace std;
class comp{
    public:
bool operator()(const int &a,const int &b){
        if(a>b)
            return true;
    }
};
int main(){
    priority_queue<int,vector<int>,comp> pq;
    pq.push(5);
    pq.push(1);
    pq.push(8);
    while(!pq.empty()){
        cout<<pq.top()<<" ";
        pq.pop();
    }
    return 0;
}

Результат изменится на: 8 1 5

Я почему-то не могу этого получить, любая помощь очень ценится.

1 ответ

Решение

Я предлагаю вам прочитать предупреждения компилятора ... вы увидите, что bool operator()(const int &a,const int &b) если a<=b нет оператора возврата ... и это Undefined Behavior

Вместо этого вы должны сделать это:

      #include<bits/stdc++.h>
using namespace std;
class comp{
    public:
    bool operator()(const int &a,const int &b){
        if(a>b)
            return true;
        /* else */ return false;
    }
};
int main(){
    priority_queue<int,vector<int>,comp> pq;
    pq.push(5);
    pq.push(1);
    pq.push(8);
    while(!pq.empty()){
        cout<<pq.top()<<" ";
        pq.pop();
    }
    return 0;
}
Другие вопросы по тегам