首先是更改STL容器里的默认排序:
比如:
在定义map的时候, 如果没有指定比较函数,那么采用默认的比较函数,即按键值由小到大的顺序插入元素。
一、值大小的比较
(1) 如果元素不是结构体,那么,可以编写比较函数。下面编写的比较规则按键值由大到小的顺序将元素插入到map。
//自定义比较函数myComp,重载"()"操作符
struct myComp { //返回true的话,那么a排前面。
bool operator() (const int &a, const int &b) {
if(a != b) return a > b;
else return a > b;
}
};
map<int, char, myComp> m;
(2) 如果元素是结构体,那么可以直接把比较函数写在结构体内(即定义该结构体的比较规则)。
struct Info {
string name;
float score;
//返回ture,则自身先排前面。
bool operator < (const Info &a) const {
//按socre由大到小排列。
return a.score < score;
}
};
map<Info, int> m;
二、优先级的比较
对于priority_queue优先队列容器,优先级的比较与之前的值比较恰好相反。
struct Info {
string name;
float score;
//返回false,则自身先排前面。
bool operator < (const Info &a) const {
//按socre由小到大排列,即score越小,优先级越大。
return a.score < score;
}
};
priority_queue<Info> m;
或者
struct myComp { //返回false的话,那么a排前面。
bool operator() (const int &a, const int &b) {
//由小到大排列
return a > b;
}
};
priority_queue<int, myComp> m;
有没有被这个一下子false,一下子true搞晕了呢。
其实很简单:
①值大小比较时,a的值比b小时,函数返回true(因为默认是从小到大排序的)。
②优先级比较时,a的优先级比b小时,函数返回true(因为默认是按优先级从大到小排的,所以true时a排后面,false时a排前面)。
(PS.如果感觉解释麻烦了,请ws..这段话)
三、最后,差点把sort给忘了。
sort 默认排序一维数组从小到大。
可以自定义比较函数。
用法如下:
当然,也可以直接定义在结构体中。上面讲过了,不赘述了。
参考资料:《算法竞赛入门经典》、《ACM程序设计》。