c++ STL - priority-queue 优先级队列

priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置。下面给出priority_queue的函数列表和priority_queue的使用代码,本文中与heap有关的函数参见《STL系列之四 heap 堆》。

函数描述
priority_queue c 创建一个空的queue 注:priority_queue构造函数有7个版本
priority_queue Type为数据类型,Container为保存数据的容器,Functional为元素比较方式。如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。
c.top()返回队列头部数据
c.push(elem)队列尾部增加elem数据
c.empty()判断队列是否为空
c.size()队列中元素的个数

使用列子:
有5个同学随意入队;他们都有成绩和姓名;请按照成绩从低到高出队列,如果成绩相等,按照名字字母逆顺序出队;



class Student{
private:
    std::string name;
    short score;
public:
    Student():name(""),score(0){}
    Student(std::string name,short score):name(name),score(score){}
    short get_score() const{
        return score;
    }
    std::string get_name() const{
        return name;
    }


};

class CompareFun{
public:
    bool operator() (const Student &lf,const Student &rg) const {
        if (lf.get_score() == rg.get_score()){
            return lf.get_name() < rg.get_name(); //返回1的时机?后面的大,返回1,进行调整;把大的调整到前面
        }
        return lf.get_score() > rg.get_score();//左边大于右边,返回1;入队时,之前入队的元素大于后入队的,返回1,进行调整;
    }
};

void priority_queue_use(){
    //下面是使用优先级队列的常见形式
    std::priority_queue<Student,std::vector<Student>,CompareFun> qu_test;

    Student s1("wang",60);
    Student s2("wei",60);
    Student s3("song",54);
    Student s4("ni",76);
    Student s5("havy",80);

    qu_test.push(s1);
    qu_test.push(s2);
    qu_test.push(s3);
    qu_test.push(s4);
    qu_test.push(s5);

    std::cout << "score \t name " <<std::endl;

    while(!qu_test.empty()){
        std::cout << qu_test.top().get_score() << "\t"
                <<qu_test.top().get_name() <<std::endl;

        qu_test.pop();
    }
}

参考:

1、http://blog.csdn.net/morewindows/article/details/6976468

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值