C++ STL容器 优先队列(priority_queue)用法详解 (图文详解)(全网最详细 简单易懂)

C++ STL容器  优先队列(priority_queue)用法详解

常见用途

1,可以解决一些贪心问题;

2,也可以对dijksta算法进行优化;

既然是队列那么先要包含头文件#include ,

其底层是用堆来进行实现的

在优先队列中,优先队列本身默认的规则就是优先级高的放在队首

 

先举个例子(假设数字小的优先级高):

原先队列中有

 

现在插入一个数

 

优先队列会在容器中自动排序

    



 

定义:priority_queue

Type 就是数据类型。(int ,double等.)

Container 就是容器类型(Container必须是用数组实现的容器,默认vector,但不能用 list。)

Functional 就是比较的方式(可以自定义,默认从小到大排序)

关于自定义排序方式接下来会有说明

 

 

一般声明有
priority_queue  p1;
priority_queue  p2;
  • 下面是一些常用的操作:

1.top  访问队头元素   ( 在优先队列中,没有 front() 函数与 back() 函数 )

2.push 插入元素到队尾

3.pop 弹出队头元素

4.empty 队列是否为空

5.size 返回队列内元素个数

6.swap 交换内容

 

  • 基本类型的比较:int 型,double 型,char 型等
  • 优先级对它们的设置默认都是数字大的优先级越高

    队首元素就是优先队列内元素最大的那个


#include 
#include
using namespace std;
int a[1000010];
int main()
{
    priority_queue a;//默认为降序排序
    //等价于 priority_queue , less >q;
    a.push(5);
    a.push(10);
    a.push(15);
    a.push(1);
    while(!a.empty())
    {
        cout<

 

 

  • 关于字符 的比较 

字符中就是字典序最大

#include 
#include
using namespace std;
int main()
{
    priority_queue a;//默认为降序排序
    a.push("abc");
    a.push("abcd");
    a.push("cbd");
    a.push("abcde");
    while(!a.empty())
    {
        cout<

 

  • pari的比较,先比较第一个元素,第一个相等比较第二个
#include
using namespace std;
int main()
{
    //以下代代码返回pair的比较结果,先按照pair的first元素降序,
    //first元素相等时,再按照second元素降序:
    priority_queue >p;
    pair a(3,4);
    pair b(3,5);
    pair c(4,3);
    p.push(a);
    p.push(b);
    p.push(c);
    while(!p.empty())
    {
        cout<

 

  • 自定义数据类型的比较
#include
using namespace std;
struct Node
{
    int x;
    Node() {}
    Node(int x):x(x) {} //赋值
    bool operator<(const Node& a) const//从大到小
    {
        return x p;
    for(int i=1; i<=5; i++)//输入数据
        p.push(Node(i));
    while(!p.empty())
    {
        cout<

*****刚刚入门的小伙伴们第一接触的话看到这就可以了,下 面是关于优先队列的进一步运用*****

 



虽然有限队列有默认的排列顺序,但在很多情况下默认排序并不满足我们的需求,这就需要我们们自定义排列顺序

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

下面两种优先队列的定义是等价的(以int型为例)
priority_queueq;
priority_queue , less >q;(把元素最小的元素放在队首)
 

  •  可以在结构体内部重载运算符,改变符号号的功能
#include
using namespace std;
struct Node
{
    int x;
    Node() {}
    Node(int x):x(x) {} //赋值
    bool operator<(const Node& a) const //从大到小
    {
        return x(const Node& a) const//从小到大
    {
        return x>a.x;
    }
};
int main()
{
    priority_queue p1;//默认从大到小 等价于priority_queue,less > p1;
    for(int i=1; i<=5; i++)
        p1.push(Node(i));
    cout<<"p1 = ";
    while(!p1.empty())
    {
        cout<,greater > p2;//从小到大
    for(int i=5; i>=1; i--)
        p2.push(Node(i));
    cout<<"p2 = ";
    while(!p2.empty())
    {
        cout<

 

  •  可以在结构体内部重载运算符,改变符号号的功能
#include
using namespace std;
struct Node
{
    int x;
    Node() {}
    Node(int x):x(x) {} //赋值
};
struct cmp
{
    /*bool operator() (const Node& a,const Node& b) //从大到小
    {
        return a.xb.x;
    }

};

int main()
{
    priority_queue,cmp > p;
    for(int i=1; i<=5; i++)
        p.push(Node(i));
    cout<<"p = ";
    while(!p.empty())
    {
        cout<

 

 

 

你可能感兴趣的:(C++,STL专题)