0

如果 sort(A.begin(), A.end(), greater()) 其中 A 是向量,则得到 A 的降序;如果priority_queue,大于> Q;你得到Q的升序;我不知道为什么,在编写我的自定义运算符()时很难记住何时使用 > 何时使用 <。这是我的测试代码:有人能说出它们是如何排序的吗?

struct compare_test{ //similar to greater() in STL
    bool operator()(const int a, const int b){ 
        return a>b;
    }
};    

void my_compare_test(){
vector<int> A;    
//  priority_queue<int,vector<int>, greater<int> > Q;         
priority_queue<int,vector<int>, compare_test > Q; 
for (int i = 0; i < 5; i++){
    A.push_back(i);
    Q.push(i);
}    
 // sort(A.begin(), A.end(), greater<int>());   
sort(A.begin(), A.end(), compare_test());   //get descending order
for (int i = 0; i < 5; i++){
    cout << "A = " << A[i] << "; "; 
}
cout << endl;
while(!Q.empty()){
    cout << "Q = " << Q.top() << "; ";  ////get ascending order
    Q.pop();
}
cout << endl;

}

4

2 回答 2

3

让我们反过来说。使用排序序列时,<您会按升序获得元素。但是优先级队列则相反,因为它的目的是为您提供具有最高优先级的元素。因此,如果您将优先级队列视为排序序列,则元素从最高到最低,因为这就是优先级队列的作用。当您>改为使用时,一个普通的序列最终会从最高到最低排序,但是优先级队列,因为它采用相反的方式,最终会从最低到最高排序。

于 2013-05-22T22:50:59.617 回答
3

不要将优先级队列视为已排序。只需将其视为一种抽象数据类型,它始终可以让您快速访问“最大元素”。其中“最大元素”定义为列表中包含优先级队列数据的最后一个元素,如果列表使用与优先级队列排序相同的标准进行排序。

那么就没有冲突了。同一个比较器实际上并没有以不同的方式对不同的容器进行排序,因为优先级队列没有排序。它有一个顺序,但它没有排序。

于 2013-05-22T22:56:40.120 回答