zoukankan      html  css  js  c++  java
  • STL priority_queue

    priority_queue

      优先队列(Priority Queues):顾名思义,一个有着优先级的队列。它是一种ADT,和队列的思想差不多—— 排队,数据结构中的队列是不能插队的,不能颠倒排队的顺序,而在优先队列里,先出队列的元素不是先进队列的元素,而是优先级高的元素,默认的优先级是数字大的数优先级高。当然用户是可自定义类型的,这样就必须为元素定义一个优先级。因为出队元素不是最先进队的元素,则出队的方法有queue的front() 变为top()。

    priority_queue<Type, Container, Functional>

    Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。

    如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。

    定义

    namespace std{
        template <typename T,
                  typename Container = vector<T>,
                  typename Compare = less<typename Container::value_type> >
                 class priority_queue;
    }

    注意需要头文件:< queue >

    priority_queue<int>pq1;     
    or
    priority_queue<int,deque<int> >pq3;

    自定义类型

    
    
    priority_queue<int,vector<int>,greater<int> >pq2;//优先级定义为数字小的优先级大

    相关函数

    入队,如例:heap.push(x); 将x 接到队列的末端。
    出队,如例:heap.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
    访问队首元素,如例:heap.front(),即最早被压入队列的元素。
    访问队尾元素,如例:heap.back(),即最后被压入队列的元素。
    判断队列空,如例:heap.empty(),当队列空时,返回true。
    访问队列中的元素个数,如例:heap.size()

    插入元素push()

    
    
    int a[10]={2,3,4,1,8,6,5,7,9,5};
    for(int i=0;i<10;i++)
    {
        pq1.push(a[i]);
    }

    删除元素pop()

    
    
    pq1.pop();//即删除队头元素,出队

    取队头元素top()

    
    
    int e = pq1.top();//将队头元素的值赋给e

    大小

    int size = pq1.size();

     

    实例

     1 #include<cstdio>
     2 #include<queue>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     priority_queue<int>pq1;                          //默认是降序 
     9     int a[10]={2,3,4,1,8,6,5,7,9,5};
    10     for(int i=0;i<10;i++)
    11     {
    12         pq1.push(a[i]); 
    13     }
    14     while(!pq1.empty()){
    15         printf("%d ",pq1.top());//打印出9 8 7 6 5 5 4 3 2 1
    16         pq1.pop();
    17     } 
    18     printf("
    ");
    19 
    20     priority_queue<int,vector<int>,greater<int> >pq2;//可以重写成升序  
    21     int b[10]={2,3,4,1,8,6,5,7,9,5};
    22     for(int i=0;i<10;i++)
    23     {
    24         pq2.push(b[i]);
    25     }
    26     while(!pq2.empty()){
    27         printf("%d ",pq2.top());//打印出1 2 3 4 5 5 6 7 8 9
    28         pq2.pop();
    29     }
    30     printf("
    ");
    31     priority_queue<int,deque<int> >pq3;
    32     int c[10]={2,3,4,1,8,6,5,7,9,5};
    33     for(int i=0;i<10;i++)
    34     {
    35         pq3.push(c[i]);
    36     }
    37     int size = pq3.size();
    38     printf("%d
    ",size);        //输出10
    39     while(!pq3.empty()){
    40         printf("%d ",pq3.top());//打印出9 8 7 6 5 5 4 3 2 1
    41         pq3.pop();
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    FFT学习及简单应用(一点点详细)
    Codeforces 1131 (div 2)
    【NOI2012】魔幻棋盘
    【hdu多校联考第二场】Odd Shops
    【Helvetic Coding Contest 2018】B2. Maximum Control (medium)
    解线性同余方程组
    Math teacher's homework
    【NOIP模拟赛】一道挖掉背景的数学题
    逆向基础-模块隐藏之断链
    解决请求筛选模块被配置为拒绝包含的查询字符串过长的请求
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8444339.html
Copyright © 2011-2022 走看看