是什么导致了priority_queue和sort()函数中排序方式的不同?

时间:2018-06-16 23:30:08

标签: c++ sorting c++11 std priority-queue

我正在学习在标准库中使用priority_queue容器和sort()函数,并对priority_queuesort()函数的比较函数的参数感到困惑

对于sort()函数,我的比较函数:第一个参数<第二个参数将从最小到最大排序。 就像下面的代码

一样

对于priority_queue容器,我的比较函数:first arguemnt>第二个参数将元素从最小到最大排序。 就像下面的代码

一样

是什么导致了差异?

这是我使用std::priority_queue的代码:

#include <functional>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
struct Compare {
    bool operator() (int left, int right) {
    //here is left>right  .......... (1)
    return(left>right);
    }
};

template<typename T> 
void print_queue(T& q) {
    while(!q.empty()) {
        std::cout << q.top() << " ";
        q.pop();
    }
    std::cout << '\n';
}

int main() {
    std::priority_queue<int,vector<int>,Compare> q;

    for(int n : {1,8,5,6,3,4,0,9,7,2})
    q.push(n);

    print_queue(q);

}

输出:

0 1 2 3 4 5 6 7 8 9 

这是我使用sort()的代码:

#include<bits/stdc++.h>
using namespace std;

bool compare(int i1, int i2)
{   //here is i1<i2       .............(2)
    return (i1 < i2);
}

int main()
{
    int arr[] =  { 6,2,1,5,8,4};
    int n = sizeof(arr)/sizeof(arr[0]);
    sort(arr, arr+n, compare);

    cout << "Intervals sorted by start time : \n";
    for (int i=0; i<n; i++)
        cout << arr[i]<<",";
    return 0;
}

输出:

1,2,4,5,6,8

1 个答案:

答案 0 :(得分:3)

简短的回答是c ++标准这样说:

所以你需要反转比较以获得相同的结果。

为什么选择std :: priority_queue来暴露更大的元素,我不知道,但我怀疑它是受Knuth第5.2.3节的启发。 (D. E. Knuth,计算机程序设计的艺术。第3卷:排序和搜索。)如good old Stl SGI

的注释中所述。