您现在的位置是:首页 > 正文

priority_queue 第三个模板参数和sort 的第三个形参的区别

2024-04-01 06:51:09阅读 2

一、priority_queue

	priority_queue<int,vector<int>,greater<int>> q;

	auto cmp = [](const int & a, const int & b) {return a < b; };
	priority_queue<int, vector<int>, decltype(cmp)> que4(cmp);
	priority_queue<int, vector<int>, function<bool(const int&, const int&)>> que5(cmp);
  • priority_queue<int,vector< int >,greater< int >> q;
  • priority_queue<int, vector< int >, decltype(cmp)> que4(cmp);
  • priority_queue<int, vector< int >, function<bool(const int&, const int&)>> que5(cmp);

以上三种,传入的都是类名,第一个调用的是无参的构造函数、第二、三种要带参数的构造函数(第二第三其实是一种,只不过用decltype 少写了代码;

也就是说:自己实现的函数,需要在模板中传入函数的类型,形参中还得传入函数实体,否则构造不出来;调用的是带参数的构造函数;而greater 只需要传进去 的类型,构造过程调用的是默认构造;

至于为什么 greater 只需要调用默认构造;因为queue 库中有包含 less 、greater 的仿函数实现,直接构造即可;而自己传入的,因为找不到实现,所以需要传入来构造;

在这里插入图片描述

  • 如果用自己的函数,但又不传入函数实体;就会编译阶段报错无法构造;
  • priority_queue<int, vector, decltype(cmp)> que4;

在这里插入图片描述

二、sort

	auto cmp = [](const int & a, const int & b) {return a < b; };
	
	sort(nums.begin(), nums.end(), greater<int>());
	sort(nums.begin(), nums.end(), cmp);

首先知道的是,模板函数可以不用<> 声类型,因为可以根据传参推断;

而模板类,因为需要类型来构造成员变量,所以必须提前声明类型;否则就是先有鸡还是先有蛋了;

函数内传入对象实例;(自定函数传入,其实相当于function类传入);都是构造了函数实体;

greater() 相当于 构造了greater类 的对象实例;内部用其重载的() 来实现了比较;

在这里插入图片描述
然后sort 内部根据传入的binary_function (二元函数对象类、二元谓词)进行快排、堆排、插入排序的;

所谓谓词:要求描述了返回可作为 bool 测试的值的可调用 (Callable) 体。

这个比较方式被用在了partition的过程中;通过仿函数,传入两个参数来作为对比;
在这里插入图片描述

三、总结

  • priority_queue 需要的是类型,根据类型,自己类内部定义对象来做;
  • sort 需要的就直接是对象;根据传入对象来实现比较;(仿函数对象,自定义函数对象)

传入greater 就是传入类型,因为这只是个类;
传入greater() (带括号) 就是构造了一个这个类的对象,传入的是对象;

网站文章

  • 【Day_13】▲跳石板

    这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。本题的核心思想就是从初始位置...

    2024-04-01 06:51:02
  • SpringBoot 打包jar文件运行以后,数据库出现乱码问题

    SpringBoot 打包jar文件运行以后,数据库出现乱码问题

    springboot项目打成jar包以后,通过 java -jar xxx.jar运行后台以后,有时候会出现数据库乱码问题,当我们排除项目本身的配置文件中的配置,以及数据库中的编码格式以后,应该问题在...

    2024-04-01 06:50:23
  • 前后端的yield

    后端:yield是作用于多线程的一个让步方法,调用该方法后本线程会暂停下来,直到其它线程运行完后再继续执行; 前端:yield在Generator函数中使用,表示暂停,以实现Generator函数分段执行的功能,通过Generator函数调用next方法继续执行下一段,直到遇到下一个yield再暂停或直接运行完毕。 ...

    2024-04-01 06:50:15
  • Python每日一算法之”最接近k个数”(列表函数运用)

    问题描述:给定一个目标数target,一个非负整数k,一个按照升序排列的数组A。在A中找出与target最接近的k个整数,返回这k个数并按照与target的接近程度从小到大排序,如果接近程度相同,那么...

    2024-04-01 06:50:07
  • 红米hm2a显示无法连接到服务器,红米HM2A刷机教程

    红米hm2a显示无法连接到服务器,红米HM2A刷机教程

    红米刷机教程刷机教程方法1:系统内升级下载必要的文件,为刷机过程做准备。MIUI完整包跨版本升级、降级均需手动进入Recovery 清除全部数据。下载 MIUI_ROM 最新安装包 立即下载如果已经在...

    2024-04-01 06:49:28
  • 知名大厂的18道Android面试题曝光,你能回答几道?

    知名大厂的18道Android面试题曝光,你能回答几道?

    最近一位知名大厂的Android技术主管,跟我透露了他们公司的18道超难的Android面试题,有些题小编看了都觉得很刁钻。今天小编给大家来做个剧透,你也可以对应看一下,你能回答出来几题?下面有面试题...

    2024-04-01 06:49:22
  • 第三方登陆html,第三方登录流程.html

    第三方登陆html,第三方登录流程.html

    第三方登录流程$axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif';...

    2024-04-01 06:49:14
  • Windows环境下使用Nexus-3.16x版本构建Maven私有仓库

    Windows环境下使用Nexus-3.16x版本构建Maven私有仓库

    一、Nexus的下载与安装下载Nexus官方下载地址:https://www.sonatype.com/download-oss-sonatype安装1. 安装环境:系统环境:Windows10 JDK版本:1.8.0_11 Maven版本:3.3.9 Nexus版本:3.16.0-012. 安装步骤:① 解压下载好的Nexus,截图如下:根目录...

    2024-04-01 06:49:07
  • pdf.js 使用实例

    pdf.js 使用实例

    https://www.cnblogs.com/xiangliuyunyang/p/5956453.html pdf.js可以实现在html下直接浏览pdf文档,是一款开源的pdf文档读取解析插件 pdf.js主要包含两个库文件,一个pdf.js和一个pdf.worker.js,,一个负责API解析,一个负责核心解析 下载地址:http://cnblogs.com/files/...

    2024-04-01 06:48:21
  • 【序列推荐】CIKM2020|S3---基于自监督学习的序列推荐模型

    【序列推荐】CIKM2020|S3---基于自监督学习的序列推荐模型

    前言文章发表在2020年CIKM会议上,与以往分享的端到端的模型不同,文章基于互信息最大化(mutual information maximization)原则,提出了一个自监督的序列推...

    2024-04-01 06:48:13