堆,一种非常重要的数据结构。能实现数据的自动排序,而且排序时间复杂度为O(nlogn),在n达到10^4时,O(n2)级算法就容易超时,但堆排序不会。堆可调用STL系统函数,简化代码,容易书写。一般情况,如果堆元素为数、字符、字符串都可有用默认的排序规则。如果元素是pair类型,其比较大小的方式为先比较第一个元素(pair.first),如果第一个元素相等,则比较第二个元素(pair.seconed)。如果元素是结构体呢?没有默认的排序,我们需要手动添加比较规则。
结构体比较实现方法有两种:
方法一:重载"<"运算符。
struct person{ string name; int age; bool operator < (const person x) const { return age<x.age; } };
在优先队列中定义可以简写为priority_queue<person>hp;
方法二:重写仿函数。
struct cmp{ bool operator ()(const person a,const person b) { return a.age<b.age; } };
在优先队列中可以定义为:priority_queue<person,vector<person>,cmp>hp;
如果你想改变大根/小根,只需要改变cmp中比较大小规则即可。