Аномалия в пользовательской сортировке очереди приоритетов в 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;
}