为什么operator()函数以不同的方式更好地排序不同的容器

时间:2013-05-22 22:41:30

标签: c++ algorithm stl

如果sort(A.begin(),A.end(),greater())其中A是向量,则得到A的降序; if 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;

}

2 个答案:

答案 0 :(得分:3)

让我们从另一个方向开始。使用<对序列进行排序时,您将按升序获取元素。但是优先级队列是另一种方式,因为它的目的是为您提供最高优先级的元素。因此,如果您将优先级队列视为已排序的序列,则元素将从最高到最低,因为这是优先级队列的作用。当您使用>时,普通序列最终从最高到最低排序,但是优先级队列,因为它以另一种方式排序,最终从最低到最高排序。

答案 1 :(得分:3)

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

然后没有冲突。事实上,相同的比较器实际上不以不同的方式对不同的容器进行排序,因为优先级队列没有排序。它有一个订单,但没有排序。