优先队列中元素优先级的设置

priority_queue(优先队列)内函数优先级的设置

如何定义优先队列内元素的优先级是运用好优先级的关键,下面分别介绍基本数据类型(例如int、double、char)与结构体类型的优先级设置方法。

(1)基本数据类型的优先级设置

此处的基本数据类型就是int型、double型、char型等可以直接使用的数据类型,优先队列对它们的优先级设置一般是数字大的优先级越高,因此队首元素就是优先队列内元素最大的那个(如果char型,则是字典序最大的)。对基本数据类型来说,下面两种优先队列的定义是等价的(以int型为例,注意最后两个>之间有一个空格);

priority_queue q;
priority_queue,less >q;

less表示数字大的优先级越大,而greater表示数字小的优先级越大

因此,如果想让优先队列总是把最小的元素放在队首,只需要进行如下定义:

priority_queue,greater >q;

下面是一个示例:

#include
#include
using namespace std;
int main()
{
  priority_queue,greater > q;
  q.push(3);
  q.push(4);
  q.push(1);
  printf("%d\n",q.top);
  return 0;
}

输出结果:

1
(2) 结构体的优先级设置

本节的最开头举了一个水果的例子,可以对水果的名称和价格建立一个结构体,如下所示:

struct fruit{
  string name;
  int price;
};

现在希望按水果的价格高的优先级高,就需要重载(overload)小于号"<"。重载是指对已有的运算符进行重新定义,也就是说,可以改变小于号的功能(例如把它重载为大于号的功能)。读者对此处只需要知道它的写法即可:

struct fruit{
  string name;
  int price;
  friend bool operator < (fruit f1,fruit f2){
    return f1.price

示例如下:

#include
#include
#include
using namespace std;
struct fruit{
  string name;
  int price;
  friend bool operator < (fruit f1,fruit f2){
    return f1.price>f2.price;
  }
}f1,f2,f3;
int main()
{
  priority_queue q;
  f1.name="taozi";
  f1.price=3;
  f2.name="lizi";
  f2.price=4;
  f3.name="pingguo";
  f3.price=1;
  q.push(f1);
  q.push(f2);
  q.push(f3);
  cout<

这里的小于重载号的作用与cmp函数的作用相类似,只不过定义相反。在排序中“return f1.price>f2.price",那么则是按价格高的在前面,但是在优先队列中却是价格低的在前面。

你可能感兴趣的:(算法)