C++中优先队列的使用

来源:互联网 发布:淘宝店铺运营助手在哪 编辑:程序博客网 时间:2024/06/17 11:16

C++中的常用的STL包括vectorsetmapqueue等,queue类型即我们平常所说的先入先出的队列,取出queue的头元素使用front()方法。
C++的queue头文件中同样包括优先队列,priority_queue,优先队列中最先出列的不是最先入列的元素,而是优先级最高的元素,在priority_queue中取头元素的方法是pop()
对于自定义类型的优先队列,必须指定元素的优先级,这个优先级不需要一个确定的数字,只需要比较大小即可。优先队列的声明方法例如:priority_queue<int,vector<int>,cmp>
其中cmp可以定义一个结构体,重载“()”运算符,下面是cmp的定义:

struct cmp{    bool operator() (const int a,const int b) const{        return a % 10 > b % 10    }}

对于一些常见的优先队列,STL提供了更为简单的方法,例如越小的整数优先级越大:priority_queue<int,vector<int>,greater<int> > pq
注意最后两个>写在一起会引起编译器报错,误认为是>>运算符
考虑下面这道题:
定义丑数:一个正整数因数只含有{3,5,7},所以丑数序列如下:3,5,7,9,15,21…,求第k个丑数
这道题当然可以遍历整数至所求,但显然有很大的优化空间,如果使用优先队列则会变得比较简单,对于任意丑数x来说,3x,5x,7x同样都是丑数,我们只要把从3,5,7开始计算的丑数放入优先队列,再按小数优先的规则取出第k个数即可,具体实现如下

int uglyNumber(int k){    priority_queue<int,vector<int>,greater<int> > pq;//定义优先队列    set<int> s;//判断计算出的丑数是否已经存在    const int ugly[3]={3,5,7};    pq.push(ugly[0]);    s.insert(ugly[0]);    int x=pq.top();    for(int i=0;i<k;i++){        for(int j=0;j<3;j++){            int x2=x*ugly[j];            if(!s.count(x2)){//判断x2是否已经存在                pq.push(x2);                s.insert(x2);            }        }        x=pq.top();        pq.pop();    }    return x;}
原创粉丝点击