zoukankan      html  css  js  c++  java
  • STLpriority_queue用法(重点: 升序,小根堆)

           昨晚除夕夜,没有看春晚,而是一个人在实验室参加了科大ACM的比赛。 一句话总结:完全找虐。哎……刚开始还有点自信的我,被打击了。 让自己明白,我根本不聪明啊。恩,但对于未来,还是要相信自己!用积极乐观的心态 + 勤奋刻苦,去拼搏。 要想达到一定的高度,必须一直勤奋、刻苦,积累。

           打击归打击,收获还是有的。第一是,意识到不断的勤奋很重要;第二是,见证了,程序不经常写,很常用的技巧都会陌生……昨天写快排+三次二分都花了很久;而后一道模拟题,BFS+priority_queue,忘记了优先队列的用法……

           加油。下面,总结一下priority_queue的用法,免得以后又忘记了,还要到处找(C++的STL的库,异常处理、多态、泛型编程,自己还要多积累才是。)

    #include <queue>

    using namespace std; (记得包含头文件噢)

    1.  priority_queue在STL内部定义的原型是:

          template< class T ,

                         class Sequence=vector<T> ,

                         classCompare=less<typename Sequence::value_type> > (主要,要一个空格,否则编译器会当做右移操作符,报错)

                         class priority_queue;

    最简单的用法:

    priority_queue<int>  q;   // 注意上面第二个参数,和第三个参数的默认值。

                                       // 对于内置的对象,可以这么简单的定义;特别注意第三个参数, 默认的小于号(<), 即降序排序,默认的是大根堆。权值最大的会被弹出来。

     最常见的用法:

    priority_queue<Node> q;   // 恩,自己定义的类型。

    ----------上面两种类型,当自己需要的堆是小根堆的时候,即元素按升序(从小到达的弹出),那么必须改写比较函数.

    即对于STL中优先队列的使用,最重要的就是这个比较函数的书写(或对'<', '>'的重载)了,常见的方面有下面两种:

    1. 方法一,重载'<' ('>')运算符:

    //Overload the < operator.bool operator< (const Student& structstudent1, const Student &structstudent2){
    return structstudent1.nAge > structstudent2.nAge;
    }
    //Overload the > operator.bool operator> (const Student& structstudent1, const Student &structstudent2){
    return structstudent1.nAge < structstudent2.nAge;
    }
     具体使用的时候://Declare a priority_queue and specify the ORDER as <//The priorities will be assigned in the Ascending Order of
    Agepriority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
    ----因为默认的less, 所以重载'<'后,第二个参数,第三个参数可以省略//declare a priority_queue and specify the ORDER as >//The priorities will be assigned in the Descending Order of Agepriority_queue<Student, vector<Student>,greater<vector<Student>::value_type> > pqStudent2;
    ------如果重载的是'>'运算符,必须将第三个参数写出来,greater 

    2. 方法二,构造‘比较函数’,然后指定priority_queue的第三个参数

    struct cmp

    {

           bool operator() (const Node& a, const Node &b)

            {

                    return a.key > b.key;      // 第一个元素大于第二个元素,返回真时; 对应的是小根堆,升序!

            }                                         // 当想要大根堆,降序时,让它返回false就好,即用'<' (默认值)

    }

    多关键字比较、'排序':

    struct cmp {
         bool operator() (const node &a, const node &b)
         {
             if (a.current < b.current)    return false;     //第一关键字,为升序,小根堆  (第一个大于第二的时候,返回真)
             else if (a.current == b.current)   return (a.year > b.year);   // 第二关键字,也为升序
             else return true;
         }
    };

    priority_queue<node, vector<node>, cmp> p;

    -----------其实这两种方法,很常见。使用STL的algorithm里的sort等算法时,都需要指定!

    2. 对于优先队列使用时,特别是多个case的时候,要注意初始的清空!

    while ( !q.empty() )  q.pop();    //效率不高?为什么没有提供clear的功能噢。

     q.push( cur );   q.top();   q.pop();  q.size();

    恩,对于,对于STL中优先队列的时候应该没问题了。主要两点:  1. 比较函数或运算符的重载  2. 注意case之间的清空!

  • 相关阅读:
    ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)
    --skip-grant-tables命令
    mysql之mysql_config_editor
    Mysql8报错:ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
    创建仅有查询指定表权限的用户
    centos7修改分辨率
    CreateProcess简单示例
    光标在Edit控件中的位置
    设计模式:原型模式(C++)【克隆羊多莉】
    设计模式2:策略模式工厂
  • 原文地址:https://www.cnblogs.com/mfryf/p/2671883.html
Copyright © 2011-2022 走看看