W3 school 菜鸟教程 我要自学网 信息学奥赛NOI 花哥的博客 不逼自己一把,怎知自己有多优秀——校长语录

优先队列的使用

  堆,一种非常重要的数据结构。能实现数据的自动排序,而且排序时间复杂度为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中比较大小规则即可。

posted @ 2020-04-25 23:38  耍人  阅读(187)  评论(0编辑  收藏  举报