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 如果…...
智慧树网课助手:智能化学习效率提升解决方案
智慧树网课助手:智能化学习效率提升解决方案 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 一、问题诊断:在线学习的效率困境与技术破局 1.1 …...
Janus-Pro-7B自主部署:从nvidia-smi监控到supervisor服务管理
Janus-Pro-7B自主部署:从nvidia-smi监控到supervisor服务管理 1. 项目概述 Janus-Pro-7B是DeepSeek发布的一款统一多模态理解与生成模型,它突破了传统模型在处理不同任务时的冲突问题。这个模型支持图像问答、OCR识别、图表分析等多模态理解功能&#…...
AI编程助手DeepSeek Coder:代码生成效率提升指南
AI编程助手DeepSeek Coder:代码生成效率提升指南 【免费下载链接】DeepSeek-Coder DeepSeek Coder: Let the Code Write Itself 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder 在软件开发领域,开发者每天面临着重复编码、多语…...
Phi-4-mini-reasoning推理服务监控:通过webshell日志诊断部署状态方法
Phi-4-mini-reasoning推理服务监控:通过webshell日志诊断部署状态方法 1. 模型简介 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理。作为Phi-4模型家族的一员,它经过专门微调以提升数学推…...
opencode令牌分析插件使用:API调用监控部署教程
opencode令牌分析插件使用:API调用监控部署教程 1. 引言:为什么需要API调用监控? 当你使用AI编程助手时,是否曾经遇到过这些问题:不知道模型调用了多少次API、不清楚每次调用消耗了多少token、无法监控API调用的性能…...
从404到无损输出:一个Favicon抓取API的三年优化笔记(含CDN、懒加载避坑指南)
从404到毫秒响应:Favicon API架构演进与高并发实践 第一次收到用户反馈"favicon接口返回500错误"时,我们团队正在会议室讨论如何优化爬虫性能。那是个典型的周一早晨——咖啡还没喝完,警报先响了起来。这个看似简单的图标抓取服务&…...
VBA UserForm控件交互实战:跨窗体数据传递与动态更新
1. UserForm基础与跨窗体数据传递原理 刚接触VBA UserForm时,我经常被各种控件的交互问题困扰。特别是当需要多个窗体协同工作时,数据传递就成了大难题。记得有次做订单管理系统,主窗体收集客户信息,子窗体处理产品明细࿰…...
解决SlowFast环境配置中的‘No module named torch._six’等疑难杂症:从修改压缩包到调整import路径
SlowFast环境配置深度排障指南:从源码修改到路径调整的完整解决方案 在视频理解领域,SlowFast作为Facebook Research开源的优秀框架,凭借其双路径网络设计在动作识别任务中表现出色。然而,许多开发者在环境配置阶段就会遭遇各种&q…...
Phi-3-mini-4k-instruct-gguf效果展示:温度0.0下100%一致性的制度类文本生成
Phi-3-mini-4k-instruct-gguf效果展示:温度0.0下100%一致性的制度类文本生成 1. 模型介绍与特点 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型,属于Phi-3系列中的GGUF版本。这个模型特别适合需要稳定、一致输出的场景,尤其是…...
从SRCNN到WDSR:图像超分辨率核心演进路径与关键技术剖析
1. 图像超分辨率技术的基础认知 当你用手机拍下一张照片却发现放大后模糊不清时,图像超分辨率技术就能派上用场。这项技术就像给图像装上"显微镜",能将低分辨率图片转化为清晰的高分辨率版本。不同于简单的插值放大,它通过深度学习…...
