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

news2024/12/23 5:01:13

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解决】sklearn-LabelEncoder遇到没在编码规则里的新值

文章目录 一、问题描述二、解决方法Reference 一、问题描述 问题&#xff1a;sklearn-LabelEncoder 遇到没在编码规则里的新值 二、解决方法 方法一&#xff1a;直接保存old_data和encoder_data和之间的映射关系&#xff0c;字典或者下面的csv格式里都可以。 for col in be…

UDS诊断实战系列-再谈19 04读取冻结帧子服务

本文框架 1. 前言2. 19 04 子服务2.1 请求某DTC快照信息2.1.1 请求报文格式及说明2.1.2 响应报文格式及说明 3. 开发注意事项3.1 快照高低字节顺序3.2 快照DID 1. 前言 19服务在整个UDS服务中非常重要&#xff0c;而19 04读取DTC冻结帧数据子服务又在0x19服务中非常重要&#…

<Linux开发>驱动开发 -之-资源的并发与竞争处理

&#xff1c;Linux开发&#xff1e;驱动开发 -之-资源的并发与竞争处理 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过…

K8s之Pod生命周期、启动停止钩子详解

文章目录 一、Pod生命周期流程二、初始化容器-initContainers三、主容器操作-containers1、启动钩子-lifecycle.postStart2、停止钩子-lifecycle.preStop 一、Pod生命周期流程 Pod生命周期整个过程 如下图&#xff1a; 1、在启动任何容器之前&#xff0c;前创建 pause 容器&am…

网络通信IO模型上

计算机组成 计算机由软件和硬件组成&#xff0c;软件包括CPU、内存等&#xff0c;硬件包括主板&#xff0c;磁盘&#xff0c;IO设备&#xff08;网卡、鼠标、键盘等&#xff09;、电源按钮。 内核程序加载过程 当接通电源的时候1、BIOS就会把它的一段代码放入了内存当中&#…

ORB SLAM3 构建Frame

1.构造Frame 为了构建一帧Frame&#xff0c;主要的步骤如下&#xff1a; 提取ORB特征点(ExtractORB)对提取的特征点进行矫正(cv::undistortPoints)计算去畸变后的图像边界(ComputeImageBounds)将特征点分配到网格中(AssignFeaturesToGrid) A.提取ORB特征点 首先需要对当前帧…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,该怎么办?

高薪能买来快乐吗&#xff1f; 来看看这位程序员的哀叹&#xff1a; 实在是扛不住了&#xff0c;每天都在极度焦虑和痛苦中度过&#xff0c;早上起来要挣扎着做心理建设去上班&#xff0c;已经产生生理性的头晕恶心食欲不振。有工作本身的原因&#xff0c;更多是自己心态的问…

如何在CSDN获得铁粉

文章目录 前言关于铁粉方法总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 铁粉512位即可参加此活动 完成一篇如何获得铁粉&#xff0c;或者相关的文章且质量分达到80分以上即可 关于铁粉 简单地说&#xff0c;就是在过去 N 个月内&#xff0c;一…

vscode配置flutter开发环境,不需要安装第三方安卓模拟器

1.获取Flutter SDK 点击下方的安装包&#xff0c;获取 stable 发行通道的 Flutter SDK 最新版本&#xff1a;Flutter SDK 将压缩包解压&#xff0c;然后把其中的 flutter 目录整个放在你想放置 Flutter SDK 的路径中**&#xff08;注意不要出现中文目录&#xff09;** 配置Wi…

Spring Boot配置文件(5/27)

1.Spring Boot 配置文件的分类和作用 整个项目所有重要的数据都是在配置文件中配置的 1.数据库连接信息&#xff08;包含用户名和密码的设置&#xff09; 2.项目的启动窗口&#xff1b; 3.第三方系统调用密匙等信息 4.用于发现和定位问题的普通日志和异常日志等等 大体上可以分…

基于FPGA的Bayer转RGB算法实现

1 概述 Bayer转RGB在图像处理中被称为去马赛克&#xff08;Demosaic&#xff09;&#xff0c;是机器视觉ISP流程中的一个基础且重要的算法&#xff0c;主要完成彩色图像传感器原始的Bayer格式图像到RGB格式图像的转换。 关于Bayer图像的相关概念和知识&#xff0c;本文不作介绍…

jquery data和data-属性不一致问题

延申val和value属性同样不一致 <script src"https://code.jquery.com/jquery-3.7.0.min.js"></script> <input type"text" value"F119-PW110" data-tag"F119" id"txtEngine" name"Engine" placeh…

第十六届全国大学生信息安全竞赛创新实践能力赛(CISCN)

目录 Misc 1、被加密的生产流量 Crypto 2、Sign_in_passwd Web 3、unzip 4、dumpit Re 5、babyRE Pwn 6、funcanary Misc 1、被加密的生产流量 下载附件解压后是一段流量&#xff0c;使用wireshark打开 最开始做的时候找错了方向&#xff0c;追踪到了另一个东西 …

阿里云服务器配置怎么选择合适?CPU内存带宽配置

阿里云服务器配置如何选择&#xff1f;个人用户选择通用算力型u1云服务器或轻量应用服务器&#xff0c;2核2G、2核4G配置即可&#xff0c;企业公司用户可以选择独享型ECS计算型c7、通用型g7等&#xff0c;4核8G、8核16G、4核32G等配置&#xff0c;阿里云百科来详细说下不同用户…

实验二十一、积分运算电路的输出波形分析

一、题目 利用 Multisim 分析图1所示两个积分运算电路的输出波形&#xff0c;输入电压为 200 Hz、幅值为 1 V 的方波信号。 图 1 图1\,\, 图1 二、仿真电路 在 Multism 中搭建图1所示的两个电路&#xff0c;如图2所示。为了防止电路中的直流增益过大&#xff0c;故在电容上…

node.js与内置模块

一、目标 能够知道什么是Node.js能够知道Node.js可以做什么能够说出Node.js中的JavaScript的组成部分能够使用fs模块读写操作文件能够使用path模块处理路径能够使用http模块写一个基本的web服务器 二、目录 初始Node.jsfs文件系统模块path路径模块http模块 1.初始Node.js …

[Nacos] Nacos Server处理订阅请求 (九)

文章目录 1.InstanceController#list()2.InstanceController#doSrvIpxt()3.总结 1.InstanceController#list() Nacos Server处理订阅请求 主要还是从请求中获取参数, 比如namespceId、serviceName、agent(指定提交请求的客户端是哪种类型)、clusters、clusterIP、udpPort(后续…

2023全国酒店数据

数据内容字段结构 hotel_id int(11) NOT NULL, name varchar(100) DEFAULT NULL, name_en varchar(100) DEFAULT NULL, short_name varchar(100) DEFAULT NULL, province varchar(20) DEFAULT NULL, city_id int(11) DEFAULT NULL, city varchar(20…

R语言实践——使用rWCVP在WCVP中匹配名称

使用rWCVP在WCVP中匹配名称 加载库工作流1. 示例数据&#xff1a;IUCN红色名录2. 将匹配的名称解析为接受名2.1 模糊匹配2.2 多项匹配2.3 将评估与接受的名称相关联 3. 可视化匹配过程4. 得到最终数据集 加载库 世界维管植物名录提供了所有已知维管植物物种的全球共识观点&…

LabView中条件结构的使用方法1

LabView中的条件结构包含一个或多个子程序框图&#xff0c;即分支&#xff0c;当满足某个条件时&#xff0c;相应的分支会被执行。也就是说&#xff0c;在条件结构执行时&#xff0c;仅有一个分支被执行。当程序存在两种或多种可能性时&#xff0c;可以使用条件结构。 1 创建条…