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;
}
相关文章:
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;};explici…...
Java之旅——Mybatis
Mybatis 是一个基于 Java 的 ORM(Object-Relational Mapping),用于 Java 应用程序的持久层框架,它将在 Java 对象和数据库关系之间建立一个映射。Mybatis 的作用主要是简化 SQL 语句的编写和维护,以及减少代码中的冗余…...
抽奖中的分布式锁应用
开发抽奖时遇到的分布式锁问题,特此记录一下几种实现方案 背景 开发中遇到个抽奖需求,会根据当前奖池内道具数量随机道具并发送给用户。这里面涉及到超发的问题,需要使用到分布式锁,特此记录一下常用的几种方案。 “超发”&#…...
项目总结 车牌识别
代码贴:OpenCV实战5 车牌号识别_opencv车牌字符识别_爱钓鱼的歪猴的博客-CSDN博客 目录 1、效果 2、代码思路 0、准备车配字符模板图片以及字符文件 1、对整图进行预处理 得到突出车牌的cany边缘图 2、车牌字体联通在一起,形成一个区域 3、筛选出车…...
一台服务器通过apache安装多个web应用
当我们只有一台linux服务器资源但有创建多个网站的需求时,我们可以通过安装一个网站服务器Apache进行搭建,此次服务器使用Centos 7 下面分别介绍一个域名多个端口和多个域名用Apache来搭建多个网站的操作过程。 一、使用apache 服务器 (一…...
网络连通性测试
ping 在Linux上,你可以使用Shell脚本编写一个for循环来ping一个网段的地址。下面是一个简单的示例: #!/bin/bashsubnet"192.168.0"for ((i1; i<255; i)); doip"$subnet.$i"ping -c 1 -W 1 $ip >/dev/null 2>&1if [ $…...
AntDB-S流式数据库体验
本文作者:彭冲老师,上一篇彭老师体验了亚信刚发布的社区版AntDB-T数据库,文章如下: AntDB-T交易型数据库体验 本文继续体验AntDB-S流式数据库的,AntDB-S目前还未开放社区版,可以联系AntDB小助手进行体验。…...
CentOS 和 Windows 上添加和删除路由
在 CentOS 上添加和删除路由 要在 CentOS 上添加和删除路由,你可以使用 ip 命令或修改网络配置文件。以下是使用 ip 命令的方法: 添加路由: ip route add <目标网络> via <网关> dev <接口>例如: ip route add 192.168.10.0/24 via 192.168.1.1 dev eth…...
2023年电大秋季招生截止日期 什么时候开始报名
2023年电大网上报名时间为3月份和9月份截止报考,电大每年可以报考两次,春季开始报名时间为12月份左右开始,秋季报名时间预计在6月份左右开始。 2023电大网上报名时间是什么时候 电大报名分为春季和秋季两个季节,一般春季招生时间为…...
滑动窗口问题
给定一个大小为 n≤106 的数组。 有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k为 3。 窗口位置最小值最…...
电子合同网页预览盖章效果实现
电子合同在现在应用越来越广,需求也就随之产生。 本篇文章主要记录两种网页盖章效果实现方式,自己记录一下, 也给需要的人提供一点思路和帮助。 效果 目录 JqueryCSS实现 原理 1.设置印章图片并隐藏 2.标记盖章位置元素 3.获取目标元素位…...
棋盘覆盖问题
文章目录 棋盘覆盖程序设计程序分析棋盘覆盖 【问题描述】 在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方…...
[CISCN2023]unzip
[CISCN2023]unzip 环境搭建 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><form method"post" action"1.php" en…...
基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)
在线资料库系统采用.NET开发平台进行开发,开发工具采用Microsoft Visual Studio 2010集成开发环境,后台编程语言采用C#编程语言来进行编程开发,数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息,整个…...
【Vue】二:Vue核心处理---计算属性 监视属性
文章目录 1.计算属性示例2. 监听属性3.补充 1.计算属性示例 实际上计算属性与methods中定义方法基本上没有什么区别,只是计算属性基于响应式依赖缓存,只要数据没有发生改变,计算属性从缓存中取值,只有当数据发送改变,才…...
【Web服务器集群】Nginx网站服务
文章目录 一、Nginx 概述1.什么是 Nginx2.Nginx 的特点3.Nginx 应用场景 二、Nginx 服务基础1.编译安装 Nginx 服务1.1 布置环境1.2 安装依赖包1.3 创建运行用户、组1.4 编译安装 2.Nginx 的运行控制2.1 检查配置文件2.2 启动、停止 Nginx2.3 日志分割以及升级 Nginx 服务2.4 添…...
开始第一个vue项目,环境搭建+html项目运行
【用vue.js,通过script标签导入】 1. 搭建vue脚手架 安装node js安装cnpm(淘宝源) 【vue】在windows中搭建vue开发环境(全网最详细)_vue环境搭建_一起来学吧的博客-CSDN博客2a 2. 官网下载地址: 安装 …...
Redis 的数据类型和命令帮助
文章结构 Redis 数据类型1. Redis全局命令(跟key有关系,而跟value无关)2. StringsGetting and setting StringsManaging counters 3. Lists(L)Basic commandsBlocking commands 4. Sets(S)Basic commands 5. Hashes(H)Basic commands 6. Sort…...
【C++11】智能指针
什么是智能指针: 智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函…...
三、Go的常用命令以及Go的执行原理
Go的执行原理以及Go的命令 一、Go的源码文件 Go 的源码文件分类: 如上图,分为三类: 1、命令源码文件: 声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。 命令源码文件被安装以后,GOPATH 如果…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
