问题记录——c++ sort 函数 和 严格弱序比较

引出

看下面这段cmp函数的定义


//按照vector第一个元素升序排序
static bool cmp(const vector<int>& a, const vector<int>& b){return a[0] < b[0];
}int eraseOverlapIntervals(vector<vector<int>>& intervals) {//按区间左端排序...sort(intervals.begin(), intervals.end(), cmp);...
}

问题

当我将比较函数中<换成<=时,会出现崩溃
在这里插入图片描述

原因

使用sort时需要遵循严格弱序,永远让等于的情况返回false

弱序定义

严格弱序比较指的是一种比较关系,具有以下性质:
反对称性:如果a小于b,那么b不可能小于a。但是a和b可以相等。
传递性:如果a小于b,并且b小于c,则a小于c。但是a和c可能相等。
反自反性:元素不能和自己比较。即a不小于a。

理解了一下,说人话就是:

反对称性:如果[a,b]满足你定义的规则(return了true),那么[b,a]就一定是不满足规则的,否则就得return false。
传递性:如果[a,b]满足规则,[b,c]满足规则,则[a,c]也一定满足规则。
反自反性:元素不能和自己比较。即[a,a]是不满足规则的。

显然,如果a=b时返回true的话,不满足反对称性反自反性

更进一步

看一部分c++sort原码

template<typename _RandomAccessIterator, typename _Compare>
void __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {... while (__first != __last && __comp(*__first, __pivot)) ++__first;...
}

sort是用快排实现的,

在这段代码中,

__comp(*__first, __pivot) 

这个表达式的结果,决定了while循环是否继续进行,
如果这个表达式的结果为 true,那么 __first 就会向右移动,直到找到一个元素不再小于 __pivot。

a.如果表达式返回 true,那么意味着 __first 小于 __pivot,应该被放到左边分区;
b.如果返回 false,则意味着 __first 大于或等于__pivot,应该被放到右边分区
所以如果元素相等,那么 __comp(
__first, __pivot) 应该返回 false。

而stl判断相等是使用的 !Cmp(a,b) && !Cmp(b,a),cmp是你自己定义的函数,
如果cmp在a,b相等时返回true,那么在a,b相等时表达式可以简化成 !true && !true = false
最后,导致了输入两个相等的元素,在stl看来这两个元素既不是小于,也不是等于,也不是大于。

好了,最终会导致什么后果呢?(先去大概看下快排代码)
在从小到大遍历时(pivot左边),判断小于,相等的元素返回的是false,被扔到了右边,
右边判断相等时(pivot右边),返回也是false,又被扔了回来,
循环往复,以至无穷,最终导致程序崩溃。

结论

自定义sort的cmp时, 永远让等于的情况返回false!!!

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

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

相关文章

RK3399平台开发系列讲解(USB篇)USB 枚举和断开过程

🚀返回专栏总目录 文章目录 一、连接与检测二、USB设备枚举三、断开过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 枚举/断开过程。 一、连接与检测 二、USB设备枚举 USB设备枚举一

Linux:docker的Portainer部署

官网 Portainer: Container Management Software for Kubernetes and Dockerhttps://www.portainer.io/ 1.下载 portainer也是一个docker的镜像直接下载即可 docker pull portainer/portainer 2.运行 直接运行镜像即可直接使用 docker run -d -p 8000:8000 -p 9000:9000 -…

VitePress-17- 配置- appearance 的作用详解

作用说明 appearance : 是进行主题模式的配置开关&#xff0c;决定了是否启用深色模式。 可选的配置值&#xff1a; true: 默认配置&#xff0c;可以切换为深色模式&#xff1b; false: 禁用主题切换&#xff0c;只使用默认的配置&#xff1b; dark: 默认使用深色模式&#xff…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术&#xff08;5&#xff09; 13.2 ATS&#xff08;Address Translation Services&#xff09; 单纯使用IOMMU并不能充分发挥处理器系统的效率&#xff0c;从图13-2中可以发现&…

TIM编码器接口(编码器测速)

定时器编码器接口自动计次--------->对应手册14.3.12编码器接口模式 应用场景&#xff1a; 电机控制PWM驱动电机&#xff0c;编码器测电机速度&#xff0c;PID算法闭环控制 ------------------------------------------------------------------------------------------…

C++入门学习(三十)一维数组的三种定义方式

数组是什么&#xff1f; 数组&#xff08;Array&#xff09;是有序的元素序列。 若将有限个类型相同的变量的集合命名&#xff0c;那么这个名称为数组名。组成数组的各个变量称为数组的分量&#xff0c;也称为数组的元素&#xff0c;有时也称为下标变量。用于区分数组的各个元素…

Nuxt3+Vue3(Composition API)+TS+Vite+Ant Design Vue 搭建

最近官网搭建选择了nuxtjs&#xff0c;由于框架更新了&#xff0c;其中语法也有很多变化&#xff0c;中间遇到了一些问题点做下总结。 nuxt3官方文档地址&#xff1a;https://nuxt.com/docs/getting-started/installation 安装 在安装Nuxt3之前&#xff0c;你需要保证你的nod…

第四次作业:XTuner InternLM-Chat 个人小助手认知微调实践

参考文档&#xff1a; https://github.com/InternLM/tutorial/blob/main/xtuner/README.md https://github.com/InternLM/tutorial/blob/main/xtuner/self.md 数据准备&#xff1a; 配置文件&#xff1a; # Copyright (c) OpenMMLab. All rights reserved. import torch fr…

安装 SEED-XDS560v2 Driver.exe

安装 SEED-XDS560v2 Driver.exe References CCS 5.5.0.00077 安装目录 D:\ti\ccsv5\ SEED-XDS560v2 Driver.exe 安装目录 D:\ti\ccsv5\ccs_base References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

双机调试-vm

双机调试 环境配置基础操作内存操作读内存写内存内核&#xff08;双机调试&#xff09;读内存搜索内存读内存显示为汇编指令读写寄存器和标志位杂项断点 环境配置 虚拟机端 打开cmd bcdedit /copy {current} /d Debug bcdedit /timeout 30输入以上结果重启后进入debug系统 M…

单测的思路

文章目录 单测的定义方法的单测几种生成工具的对比生成步骤 接口的单测场景的单测总结参考 单测的定义 单元测试&#xff08;Unit Testing&#xff09;是一种软件开发中的测试方法&#xff0c;它的主要目的是确保软件中的最小可测试单元&#xff08;通常是函数、方法或类&…

【无标题】管理kvm 虚拟机

管理kvm 虚拟机 点击虚拟机 创建新的虚拟机 安装操作系统 设置root密码

[VulnHub靶机渗透] Fowsniff

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【Linux系统化学习】缓冲区

目录 缓冲区 一个样例 现象解释 缓冲区存在的位置 缓冲区 在刚开始学习C语言的时候我们就听过缓冲区这个名词&#xff0c;很是晦涩难懂&#xff1b;在Linux下进程退出时也包含缓冲区&#xff0c;因此缓冲区到底是什么&#xff1f;有什么作用&#xff1f; 让我们先从一个小…

项目架构梳理

单点登录组件 CREATE TABLE user_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键,用户id,username varchar(30) NOT NULL COMMENT 用户姓名,password varchar(60) NOT NULL COMMENT 密码,token varchar(60) DEFAULT NULL COMMENT token,token_expire datetime DEF…

redis高级篇

为什么用单线程 开始多线程和io复用 linux连接redis其实就是一个socket过程 bigkey记录案例和生产故障 插入100w数据 不使用key*那使用什么&#xff1f;&#xff1a;scan bigkey发现删除优化策略

代码随想录day21--回溯基础

理论基础 回溯法也可以叫回溯搜索法&#xff0c;它是一种搜索的方式。我们在二叉树中也多次提到了回溯。回溯是递归的副产品&#xff0c;只要使用了递归就会有回溯&#xff0c;我们我们就可以笼统的将回溯函数称为递归函数 回溯法解决的问题 1.组合问题&#xff1a;N个数里面…

非线性一元方程求解——弦截法、牛顿迭代法(C++)

一元方程 对于一元方程&#xff0c;如果要求f(x)0的解&#xff0c;其过程大致包括如下三个问题&#xff1a; 根的存在性&#xff1a;是否有根&#xff0c;如果有&#xff0c;有几个&#xff1f;根的分布&#xff1a;根分布区间&#xff1b;求根的公式&#xff1a;如何从根的近…

成本效能FinOps: Crane 部署

目录 一、实验 1.环境 2.安装kind 3.安装Crane 二、问题 1.脚本安装prometheus报错 2.查看集群信息失败 3.Helm添加grafana 报错 4.查看crane资源失败 5.prometheus部署时kube-state-metrics 拉取镜像显示ImagePullBackOff 6.Crane 功能与架构 一、实验 1.环境 &a…

记录 | 验证pytorch-cuda是否安装成功

检测程序如下&#xff1a; import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell&#xff0c;运行情况如下