C++学习笔记3:sort和priority_queue的比较器重载

1 sort

三种方法

1. 直接重载函数

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }
};

bool cmp(const Node& n1, const Node& n2){
    return n1.value > n2.value;
}

int main(){
    Node* a = new Node[5];
    a[0].value = 2;
    a[1].value = 5;
    a[2].value = 2;
    a[3].value = 9;
    a[4].value = 0;

    sort(a, a + 5, cmp);
    for(int i = 0; i < 5; i++) cout << a[i].value << " ";
    return 0;
}

2. 在类中时,需要注意加上static,因为非静态函数不加static指针的时候,会隐藏地传一个this指针,导致参数表不符

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }

    static bool cmp(const Node& n1, const Node& n2){
        return n1.value > n2.value;
    }

    static void fun(){
        Node* a = new Node[5];
        a[0].value = 2;
        a[1].value = 5;
        a[2].value = 2;
        a[3].value = 9;
        a[4].value = 0;

        sort(a, a + 5, cmp);
        for(int i = 0; i < 5; i++) cout << a[i].value << " ";
    }
};

int main(){
    Node::fun();
    return 0;
}

3. 定义一个类,重载()运算符

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }
};

class CMP{
public:
    bool operator()(const Node& n1, const Node& n2){
        return n1.value > n2.value;
    }
};


int main(){
    Node* a = new Node[5];
    a[0].value = 2;
    a[1].value = 5;
    a[2].value = 2;
    a[3].value = 9;
    a[4].value = 0;

    sort(a, a + 5, CMP());
    for(int i = 0; i < 5; i++) cout << a[i].value << " ";
    return 0;
}

2 priority_queue

需要注意的是,priority_queue是一个对象模板,而sort是一个函数模板,因此在重载的时候有些区别。

sort较为常用的参数表是:

first和last是迭代器,而comp是比较器,实现方式有上面的三种。

对于priority_queue,首先需要往确定模板的类型,然后给构造函数传递参数。

上面这段是用实际类型将类模板priority_queue实例化为模板类,还并没有到由模板类构造对象的那一步。此处compare需要传递的是比较器的类型,而不是比较器本身。

我们再看构造函数:

这个地方需要传递的才是比较器。所以当比较器为函数的时候,我们的写法是:

priority_queue<Node, vector<Node>, decltype(&cmp)> pq(cmp);

 前面的decltype(&cmp)是比较器的类型,后面的cmp给构造函数传递比较器。

那么问题来了,cmp的类型为什么不是decltype(cmp)而是decltype(&cmp)呢?

cmp是一个函数指针,代表着函数的首地址,类型是:bool (*)(::Node &,::Node &),即decltype(&cmp),而查文档可知,decltype(函数)返回的是这个函数的返回值类型,即decltype(cmp)为bool (::Node &,::Node &)。

接下来是三种写法具体实现

1. 直接用函数

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }
};

bool cmp(const Node& n1, const Node& n2){
    return n1.value > n2.value;
}

int main(){
    Node* a = new Node[5];
    a[0].value = 2;
    a[1].value = 5;
    a[2].value = 2;
    a[3].value = 9;
    a[4].value = 0;

    priority_queue<Node, vector<Node>, decltype(&cmp)> pq(cmp);
    pq.push(a[0]);
    cout << pq.top().value << endl;
    pq.push(a[1]);
    cout << pq.top().value << endl;
    pq.push(a[2]);
    cout << pq.top().value << endl;
    pq.push(a[3]);
    cout << pq.top().value << endl;
    pq.push(a[4]);
    cout << pq.top().value << endl;
    return 0;
}

2. 类中函数加static

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }

    static bool cmp(const Node& n1, const Node& n2){
        return n1.value > n2.value;
    }

    static void fun(){
        Node* a = new Node[5];
        a[0].value = 2;
        a[1].value = 5;
        a[2].value = 2;
        a[3].value = 9;
        a[4].value = 0;

        priority_queue<Node, vector<Node>, decltype(&cmp)> pq(cmp);
        pq.push(a[0]);
        cout << pq.top().value << endl;
        pq.push(a[1]);
        cout << pq.top().value << endl;
        pq.push(a[2]);
        cout << pq.top().value << endl;
        pq.push(a[3]);
        cout << pq.top().value << endl;
        pq.push(a[4]);
        cout << pq.top().value << endl;
    }
};

int main(){
    Node::fun();
    return 0;
}

3. 比较类,重载()运算符

#include <vector>
#include <memory>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

class Node{
public:
    int value;
    Node(){value = 0;};
    explicit Node(int value){
        this->value = value;
    }
};

class CMP{
public:
    bool operator()(const Node& n1, const Node& n2){
        return n1.value > n2.value;
    }
};

int main(){
    Node* a = new Node[5];
    a[0].value = 2;
    a[1].value = 5;
    a[2].value = 2;
    a[3].value = 9;
    a[4].value = 0;

    // CMP cmp;
    // priority_queue<Node, vector<Node>, CMP> pq(cmp);

    priority_queue<Node, vector<Node>, CMP> pq;
    pq.push(a[0]);
    cout << pq.top().value << endl;
    pq.push(a[1]);
    cout << pq.top().value << endl;
    pq.push(a[2]);
    cout << pq.top().value << endl;
    pq.push(a[3]);
    cout << pq.top().value << endl;
    pq.push(a[4]);
    cout << pq.top().value << endl;
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值