sort:invalidcomparator(代码片段)

faithlocus faithlocus     2022-12-09     141

关键词:

1. 这是自己遇到的问题,仅做错误记录使用,比较重来没有做记录的习惯。

2. invalid comparator中文翻译:无效的比较器,尤其是使用sort函数时容易发生此问题。

3. 源码如下

#include <list>
#include <string>
#include <iostream>

using namespace std;

struct Info

    int id;
    string name;
    bool operator<(const Info rh) const
    
        return id <= rh.id;
        //return id < rh.id;
    
;

void func()

    list<Info> infos;
    infos.push_back(1, "1");
    infos.push_back(3, "3");
    infos.push_back(3, "3");
    infos.push_back(2, "2");
    infos.sort();

output:

编译正常,运行崩溃

技术图片

4. 分析原因:

4.1崩溃的位置在这里

	const auto _Result = static_cast<bool>(_Pred(_Left, _Right));
	if (_Result)
		
		_STL_VERIFY(!_Pred(_Right, _Left), "invalid comparator");
		

4.2 原因:

template<>
	struct less<void>
		// transparent functor for operator<
	typedef int is_transparent;

	template<class _Ty1,
		class _Ty2>
		constexpr auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
		-> decltype(static_cast<_Ty1&&>(_Left)
			< static_cast<_Ty2&&>(_Right))
			// transparently apply operator< to operands
		return (static_cast<_Ty1&&>(_Left)
			< static_cast<_Ty2&&>(_Right));
		
	;

结论:

  1. 使用less时,传入的比较器必须是operator<,而不能是operator<=。
  2. less就是less,less不是less_equal
  3. 不要想加上等于就可以不调换相等的元素了,这是错误的想法(在说自己)

4.3 代码修正

    bool operator<(const Info rh) const
    
        // return id <= rh.id;
        return id < rh.id;
    

java—代码块详解(代码片段)

代码块概念代码块分类普通代码块构造代码块静态代码块同步代码块代码块概念在java中,括起来的代码被称为代码块代码块分类普通代码块类中方法的方法体publicclassMain publicstaticvoidmain(String[]args) ...普通代码块 普通代码... 查看详情

textcupon代码优惠券代码discont代码(代码片段)

查看详情

代码块(代码片段)

静态代码块、构造代码块、构造方法的执行顺序?静态-》构造代码块-》构造方法静态代码块:只执行一次构造方法:每次调用构造方法都执行/**代码块:在Java中,使用括起来的代码成为代码块*根据其位置和声明的不同,可以... 查看详情

java代码块,普通代码块,构造代码块,静态代码块

学习Java中…刚刚学到了Java的代码块,虽然很简单还是记下吧!左音2016-03-16-----------------//执行优先级:静态代码块>mian方法>构造代码块>构造方法//静态代码块不论是否实例化都会执行一次,不会重复执行//构造代码块... 查看详情

ruby编写代码的代码(代码片段)

查看详情

jsonvisualstudio代码用户代码段(代码片段)

查看详情

html代码html代码(代码片段)

查看详情

java代码规范-代码格式(代码片段)

查看详情

托管代码和非托管代码

什么是托管代码?托管代码是运行在公共语言运行库上的(CLR)一个中间代码,起到编译的源代码的作用;源代码运行时分为两个阶段:一是编译源代码为托管代码,二托管代码编译为平台专用语言。托管代码运行在CLR上边,这个... 查看详情

java中普通代码块,构造代码块,静态代码块区别及代码示例2构造代码块

//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。1普通代码块1//普通代码块:在方法或语句中出现的就称... 查看详情

业务代码与非业务代码

1.什么是业务代码?直接用于实现用户需求的代码就是业务代码,比如用户需要查询某个数据,那么直接查询数据库,返回结果的代码,就是业务代码。2.什么是非业务代码?辅助业务代码,一般可以脱离业务而存在的代码,比... 查看详情

html女孩学习代码:现场代码(代码片段)

查看详情

代码块

代码块1.代码块概述 在Java中,使用{}括起来的代码被称为代码块。 2.代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。 3.代码块的应用(创建对象,就会先走构造代码块... 查看详情

java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例

Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例2018年05月08日08:12:48 WJN不忘初心 阅读数:34 除了说普通代码块,静态代码块,构造代码块的执行顺序外,还有静态方法,静态变量等,都放在一起... 查看详情

好代码,坏代码:你的代码和其他工程师的代码(代码片段)

如果你以团队一员的身份编写代码,你所编写的代码很可能建立在其他工程师编写的代码层次的基础上,其他人也可能以你的代码为基础构建新的代码层次。如果你在工作期间解决了各种各样的子问题,并将其分解为... 查看详情

java中普通代码块,构造代码块,静态代码块区别及代码示例

//普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”publicclassCodeBlock01{publicstaticvoidmain(String[]args){{intx=3;System.out.println("1,普通代码块内... 查看详情

抽取公共代码(代码片段)

如果要彻底明白WebpackV4版本如何抽取公共代码,就要设计一个场景来支持抽取公共代码的多种形式,能够从代码运行的结果中查看实际的效果,从效果中深入理解各个参数的作用。场景设计在设计场景之前,首先要明白公共代码... 查看详情

#代码质量控制和代码质量相关工具说明(代码片段)

代码质量检测工具及检测说明代码质量与规范高质量代码的优势易读性、可维护性高安全性、可测试性高高内聚低耦合方便功能扩展代码质量目标代码质量管控规范化:建立代码规范与CodeReview制度自动化:使用工具自动... 查看详情