priority_queue 优先队列_自定义比较函数_four_means

//
priority_queue< T,C,cmpF >

T : 数据类型 
C : 存储数据的容器
cmpF : 数据比较方式

//
由于优先队列默认为大顶堆 

重载 operator < 时 
bool operator < ( const T& a,const T& b )

return true 说明 a < b
b 会被认为是大值 放在前面
a 会被认为是小值 放在后面
并不关心函数内部是如何定义的

所以我们只需要 return ( a > b ) ; 
若成立, 函数认为b为大值, 被放在前面, 
其实b为小值, 这样就实现了小顶堆.

所以 return true 表明 后者被放在前面
// 这与 sort_cmp 是完全相反的

为了方便理解 我们可以在重载时 
将 判断语句/三元运算符 中 ab 位置对换一下
这样就很容易理解到底是怎么一个比较情况了

此时 判断语句/三元运算符 内的情况 
就是我们希望得到的排序情况 // 忽略元素 只关注逻辑运算符本身

第二种方法是一元谓词 本质也是一样
只不过将 AA 本身看成 a, 将 in 看成 b.
//
// 01 在结构体外重载 operator < 
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
};
bool operator < ( const AA& a,const AA& b )
{
    return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
}
priority_queue q;
// const AA&
// const AA
// AA           
// AA&          (x)
//
// 02 在结构体内重载 operator < 一元谓词
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
                                            // 一元谓词 一定无 friend 一定有 const
    bool operator < ( const AA& in ) const  
    {
        return ( x == in.x ) ? ( y > in.y ) : ( x > in.x ) ;
    }
};
priority_queue q;
// const AA&
// const AA
// AA           
// AA&          (x)
//
// 03 在结构体内重载 operator < 二元谓词
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
                                            // 二元谓词 一定有 friend 一定无 const
    friend bool operator < ( const AA& a,const AA& b )
    {
        return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
    }
};
priority_queue q;
// const AA&
// const AA
// AA           
// AA&          (x)
//
// 04 自定义 比较类 仿函数
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
}; 
struct cmp
{                                               // 可以有 const
    bool operator () ( const AA& a,const AA& b ) const
    {
        return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
    }
};
priority_queue< AA,vector,cmp > q;
// const AA&
// const AA
// AA           
// AA&          
// (均可)

// eg.01
#include
using namespace std;

//
// 01 在结构体外重载 operator < 
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
}in;
bool operator < ( const AA& a,const AA& b )
{
    return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
}
priority_queue q;

int main()
{
    int n;
    while( cin>>n )
    {
        while( n-- )
        {
            cin>>in.x>>in.y;
            q.push( in );
        }
        cout<
// eg.02
#include
using namespace std;

//
// 02 在结构体内重载 operator < 一元谓词
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
                                            // 一元谓词 一定无 friend 一定有 const
    bool operator < ( const AA& in ) const  
    {
        return ( in.x == x ) ? ( in.y < y ) : ( in.x < x ) ;
    }
}in;
priority_queue q;

int main()
{
    int n;
    while( cin>>n )
    {
        while( n-- )
        {
            cin>>in.x>>in.y;
            q.push( in );
        }
        cout<
// eg.03
#include
using namespace std;

//
// 03 在结构体内重载 operator < 二元谓词
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
                                            // 二元谓词 一定有 friend 一定无 const
    friend bool operator < ( const AA& a,const AA& b )
    {
        return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
    }
}in;
priority_queue q;

int main()
{
    int n;
    while( cin>>n )
    {
        while( n-- )
        {
            cin>>in.x>>in.y;
            q.push( in );
        }
        cout<
// eg.04
#include
using namespace std;

//
// 04 自定义 比较类 仿函数
struct AA
{
    int x,y;
    AA ( int a=0,int b=0 ):x(a),y(b) {}
}in; 
struct cmp
{                                               // 可以有 const
    bool operator () ( const AA& a,const AA& b ) const
    {
        return ( b.x == a.x ) ? ( b.y < a.y ) : ( b.x < a.x ) ;
    }
};
priority_queue< AA,vector,cmp > q;

int main()
{
    int n;
    while( cin>>n )
    {
        while( n-- )
        {
            cin>>in.x>>in.y;
            q.push( in );
        }
        cout<

你可能感兴趣的:(#,c++_STL,知识图谱)