• 06--STL序列容器(priority_queue)


    一:优先队列priority_queue简介

    同队列,不支持迭代

    (一)和队列相比

    同:

    优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。

    异:

    但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。
    这点类似于给队列里的元素进行了由大到小的顺序排序。

    补充:元素之间比较

    元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

    (二)重点:同vector,deque,list,以及queue比较

    虽然与queue相似,但是之所以不放在queue之后讲,是因为实现优先队列是要依靠容器的迭代器实现的,而queue和stack是没有迭代功能的。

    而且stl中优先队列是基于vector和deque实现的,是基于这两种容器的迭代特性实现--->支持随机存取迭代


    这也是为什么优先队列不可以基于list实现--->list不支持随机存取迭代

    二:优先队列priority_queue的构造

    priority_queue<int, vector<int>, cmp> q;    //定义方法
    //其中第一个是数据类型,第二个参数为容器类型:默认是vector。第三个参数为比较函数:默认less。

    案例1:默认最大值优先

             priority_queue<int, deque<int>>    pq;  //基于双端队列
    
             priority_queue<int, vector<int>>    pq;  //基于向量
    上面是默认最大值优先

    案例2:修改比较方式

            priority_queue<int,vector<int>, less<int>> pq1;     // 使用递减 less<int>函数对象排序    首位最大
            priority_queue<int,deque<int>, greater<int>> pq2;    // 使用递增greater<int>函数对象排序  首位最小

    三:优先队列常用操作

    q.empty()        如果队列为空,则返回true,否则返回false
    
    q.size()         返回队列中元素的个数
    
    q.pop()          删除队首元素,但不返回其值
    
    q.top()          返回具有最高优先级的元素值,但不删除该元素
    
    q.push(item)     在基于优先级的适当位置插入新元素
        priority_queue<int,vector<int>> pq;
        pq.push(5);
        pq.push(50);
        pq.push(16);
    
        while (!pq.empty())
        {
            cout << pq.top() << " ";
            pq.pop();
        }

    四:自定义比较结构

    struct cmp1{
        bool operator ()(int &a,int &b){
            return a>b;//最小值优先
        }
    };
    void main()
    {
        priority_queue<int,vector<int>,cmp1> pq;
        pq.push(5);
        pq.push(50);
        pq.push(16);
    
        while (!pq.empty())
        {
            cout << pq.top() << " ";
            pq.pop();
        }
    
    
        system("pause");
    }

    五:自定义数据结构(重载<比较运算符)

    struct number1{
        int x;
        bool operator < (const number1 &a) const {
            return x>a.x;//最小值优先
        }
    };
    void main()
    {
        priority_queue<number1, vector<number1>> pq;
        number1 n1, n2, n3;
        n1.x = 5;
        n2.x = 50;
        n3.x = 16;
        pq.push(n1);
        pq.push(n2);
        pq.push(n3);
    
        while (!pq.empty())
        {
            cout << pq.top().x << " ";
            pq.pop();
        }
    
    
        system("pause");
    }

    数据结构(四)树---哈夫曼树了解以及代码实现

  • 相关阅读:
    用原生js实现ajax、jsonp
    $.ajax()方法详解
    用原生js实现ajax
    escape()、encodeURI()、encodeURIComponent()区别详解
    stylus项目知识点
    vue之给a标签赋值
    iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
    iOS开发——高级语法篇&继承、实现、依赖、关联、聚合、组合的联系与区别
    iOS-性能优化4
    iOS-性能优化3
  • 原文地址:https://www.cnblogs.com/ssyfj/p/10789732.html
Copyright © 2020-2023  润新知