Одна и та же функция сравнения дает разные результаты для сортировки и приоритетной очереди в C++

Я пытаюсь понять, как работает пользовательская функция сравнения в STL. Я написал программу ниже и передал пользовательскую функцию функции сортировки STL и очереди приоритетов. Я ожидал, что оба результата будут отсортированы в порядке возрастания, но это не так.

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

struct compareStruct {
  bool operator() (int i,int j) 
  { 
    return (i<j);
  }
} compare;


int main() {

    int numbers[] = {32,71,12,45,26,80,53,33};
    vector<int> myvector (numbers, numbers+8);  
    sort (myvector.begin(), myvector.end(), compare);

    priority_queue<int, vector<int>, compareStruct> mypq;
    for(int i=0;i<8;i++)
    {
        mypq.push(numbers[i]);
    }

    cout<<"Vector Sort Output :\n";
    for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        cout << *it<<" ";

    cout<<"\nPriority Queue Output: \n";
    while(!mypq.empty())
    {
        cout << mypq.top()<<" ";
        mypq.pop();
    }
    return 0;
}

Вывод вышеуказанной программы:

Результат векторной сортировки: 12 26 32 33 45 53 71 80 Выход приоритетной очереди: 80 71 53 45 33 32 26 12


person Rohit N    schedule 25.12.2018    source источник
comment
Он работает, как задумано. Прежде чем использовать библиотечную функцию или контейнер, вы должны прочитать некоторую документацию: std::priority_queue.   -  person Blastfurnace    schedule 25.12.2018


Ответы (1)


Очередь с приоритетом сортируется в обратном порядке, первая является самой большой, а не самой маленькой (см. ссылку).

Если вы хотите такой же порядок, используйте:

priority_queue<int, vector<int>, greater<int>> mypq;
person Matthieu Brucher    schedule 25.12.2018
comment
Мой вопрос касался compareStruct, который я использовал при создании очереди приоритетов. Разве эта функция не должна сортировать элементы в порядке возрастания, когда я вставляю элемент в очередь? - person Rohit N; 25.12.2018
comment
Нет, потому что приоритетная очередь использует самый большой элемент первым при использовании компаратора less. Так что это обратный порядок sort с less. Если вам нужен тот же порядок, вам нужны два разных оператора сравнения. - person Matthieu Brucher; 25.12.2018
comment
Спасибо, Матье!! - person Rohit N; 25.12.2018