比较函数
在用c++ code的时候经常会用到比较函数cmp(比如sort和priority_queue),在此做个总结。
SORT
sort(num.begin(), num.end(), cmp);
方法一:自定义cmp函数
sort方法中默认的运算是a<b,小于则True,否则False。在默认的逻辑中,小的元素排在前面。
在自定义排序操作时,同样有返回True的时候表示a比b“小”,返回False的时候表示a比b“大”。如下例所示,如果返回的表达式是a>b,则表示在当前的逻辑中,a>b表示a比b“小”,a将排在b的前面,也就是我们通常理解的降序排列。
bool cmp(const int& a, const int& b){
return a > b;
}
如果使用自定义数据结构也是同理
bool cmp(const node& a, const node& b){
if(a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
方法二:重载<运算符
这个和方法一类似,只是写法不同(这个一般写在node类中,可以少一个参数)
bool operator< (const node& a, const node& b){
if(a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
方法三:比较结构体
stl中默认都是用()来比较的,所以也可以重载()
struct cmp{
bool operator() (const node& a, const node& b){
if(a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
}
方法四:内置比较函数
把cmp替换成less<Type>,greater<Type>等即可。
PRIORITY_QUEUE
priority_queue<int, vector<int>, cmp> pq;
先说结论,优先队列的cmp和sort的cmp是反着的,也就是优先队列默认是大根堆。
具体原因是在push的时候,value会逐步和parent比较,并作为<的右操作数,也就是说重载的<其实是>。