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

这篇具有很好参考价值的文章主要介绍了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较为常用的参数表是:

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

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

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

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

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

我们再看构造函数:

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

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

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. 比较类,重载()运算符文章来源地址https://www.toymoban.com/news/detail-462461.html

#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;
}

到了这里,关于C++学习笔记3:sort和priority_queue的比较器重载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++优先队列(priority_queue)详解

    目录 一、 定义 二、优先队列内元素访问 三、优先队列常用函数 四、优先队列内元素的优先级          优先队列(priority_queue),底层的数据结构为 堆(heap) ,以此 保证队首元素一定是当前队列所有元素中优先级最高的。 我们也可以随时往优先队里面加入(push)元素,其队

    2024年02月16日
    浏览(39)
  • C++ | 仿函数与priority_queue

    目录 前言 一、初始仿函数 1、仿函数是什么 2、仿函数的使用  二、优先级队列 1、 优先级队列的基本概念 2、堆的储存结构与结点之前关系 3、堆的使用 4、堆的模拟实现         本文主要介绍优先级队列与仿函数,优先级队列实际上是我们在数据结构中学的堆;在介绍

    2024年02月15日
    浏览(36)
  • 【C++】priority_queue使用与模拟实现

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月16日
    浏览(42)
  • C++ 优先队列 priority_queue 使用篇

    目录 1.储备知识    (1)数据结构:堆   (2)仿函数(函数对象)     [1]理解仿函数     [2]实现仿函数   (3)priority_queue理解     [1]什么是priority_queue (优先队列)?     [2]优先队列性质 2.priority_queue的参数理解(重要!!!)   (1)priority_queue的参数     [1]priority_queue类模板参数     [

    2024年03月12日
    浏览(81)
  • C++中的优先队列(priority_queue)

    什么是优先队列 优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有优先级最高先出的性质。通常采用堆数据结构来实现。

    2024年02月15日
    浏览(46)
  • [C++]priority_queue的介绍及模拟实现

    目录 priority_queue的介绍及模拟实现::                                                         priority_queue的介绍                                                         priority_queue的定义方式                 

    2024年02月04日
    浏览(43)
  • C++:模版进阶 | Priority_queue的模拟实现

                                                创作不易,感谢三连支持  模板参数分类为 类型形参与非类型形参 。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是 用一个常量作为类(函数)模板的一个参数 ,在类(函数

    2024年03月12日
    浏览(42)
  • 【C++】STL之priority_queue类源码剖析

    目录 概述 算法 源码 PriorityQueue.h test.cpp 测试结果 priority_queue:优先级队列,包含在头文件queue中 优先级队列类似于堆结构,优先级最高的元素被置为堆顶,最优先被弹出top()和删除pop() 优先级队列的默认调整策略是大根堆,也就是最大值在堆顶 自定义类型需要用户自己提供

    2024年02月02日
    浏览(39)
  • c++ priority_queue用法 入门必看 超详细

    priority_queue即优先级队列,它的使用场景很多,它底层是用大小根堆实现的,可以用log(n)的时间动态地维护数据的有序性。适用于许多场景,比如简化哈夫曼树算法、dijkstra算法等等 priority_queue是不允许随机访问,只能访问队列首部的元素,也只能对首部元素进行出队,下面进

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包