这两天忙着在准备3月份打PAT考试,许久没有接触刷题了,各种生疏各种忘记,刷题速度那是一个慢,真是为自己智商着急。今天刷题碰到了一个有意思的编程习惯性错误,好几道题都涉及到自定义排序,需要自己重写<操作符号,我在调试的时候,程序提示assertion error: Invalid operator<,思考了很久也没有发现问题,在网上搜寻了这个问题,大概是理解了,将我对这个问题的理解总结一下。
案例:如自定义结构体Cmp
struct Cmp { int field1,field2; bool operator<(const Cmp& cmp) { if(this->field1 < cmp.field1) return true; else if(this->field2 < cmp.field2) return true; return false; } };
此结构体的大小主要是按照field1进行排列,如果field1排不出来,就按照field2进行排列。这段代码看上去没有什么问题,但是如果使用algorithm stl中的sort函数对含有此类型的数组进行排序,在debug模式下会出现断言失败的提示,即invalid operator<,表示这个自定义的比较函数不严格,可能会有问题。
仔细分析,也很容易看出来这段代码错在什么地方,在第二个if判断中,我们仅仅是判断了第二个field大小,忘记加上对第一个field的限制了,把该if判断改成
else if(this->field2 < cmp.field2 && this->field1 == cmp.field1)
发现警告消失了,为什么会这样呢?标准库中的sort函数为什么要我们这么写?
sort函数要求比较函数是strict weak ordering的,而strict weak ordering必须满足三个条件:
1) Strict: pred (X, X) is always false. X跟X自己比为false
2) Weak: If ! pred (X, Y) && !pred (Y, X), X==Y. 当X<Y和Y<X都不成立时,X等于Y
3)Ordering: If pred (X, Y) && pred (Y, Z), then pred (X, Z). 当X<Y,Y<Z时,X<Z成立,即排序的一个传递性。
用一个实例来说明问题。假设有三个变量,m1(1,2),m2(2,1),m3(1,2)。(括号内的两个数分别表示field1和field2的值。在前面有问题的代码下,我们可以判断:
1)m1<m2,并且m2<m3,根据条件3,m1<m3,但是很明显m1跟m3是一样的,应该是相等的!
2)也可以发现在该规则下,m2<m1也成立!根据条件1,推导出m1竟然与m2相等,m1==m2!
这两个情况明显不符合常理,如果允许程序这样运行,最后的结果谁也想不到会排成什么样子。
综上所述,在写比较函数的时候一定要小心,不要粗心大意漏掉了条件。这也告诫了我们编译器给出的各种提示警告,还是老老实实地去遵守比较好,不然到后来吃了哑巴亏也不知道是什么地方出了问题。
相关推荐
invalid type assertion error(解决方案).md
invalid_request_error是开发人员在使用Web服务API时经常遇到的一个问题。当API端点接收到一个请求时,如果请求的格式不正确或不符合API的预期,就会返回一个invalid_request_error错误。解决这个问题的关键在于确保...
解决此类问题一般需要遵循几个步骤,本文将详细介绍在使用Python语言和requests库时,如何排查并解决invalid_request_error错误。 首先,要确保请求的URL正确无误。URL错误是最简单也是最常见的错误,可能是由于...
invalid_index_error是编程中经常遇到的一个错误,尤其在使用Python的Pandas库进行数据操作时。这个错误通常发生在尝试访问DataFrame或Series中不存在的索引时。为了解决这个错误,我们可以采取多种方法。 首先,一...
这类错误通常被称为类型错误(TypeError),而在类型不正确的情况下引发的特定错误叫做无效类型错误(invalid_type_error)。这种错误提示开发者赋给变量的值的类型和变量预期接收的类型不符。例如,在Python中,一...
在处理使用Pandas进行数据操作的过程中,我们可能会遇到invalid_index_error。这种错误通常发生在尝试访问DataFrame或Series中不存在的索引时。为了解决这个问题,我们可以采取以下步骤和方法。 首先,我们需要检查...
invalid_format_error是计算机编程中常见的错误提示,它通常表示输入的数据格式不正确或与预期不符。解决无效格式错误的方法多种多样,需针对不同编程语言和应用场景具体分析。例如,在处理JSON数据时,若遇到无效的...
invalid type assertion(解决方案).md
invalid_argument_error是编程中常见的一个错误提示,它通常表示提供的参数不符合函数或方法的预期,或是因为参数类型错误,或是因为参数超出了有效范围。解决这类错误需要具体问题具体分析,下面将提供一些常见的...
【Navicate Premium 12 64bit】是一款专为Windows操作系统设计的高效能数据库管理工具,尤其适用于64位环境。Navicat是著名的数据库管理和开发软件,它集成了多种数据库系统的连接功能,包括MySQL、Oracle、SQL ...
invalid type assertion syntax(解决方案).md
在编程过程中,"invalid_argument_error"是一种常见的错误,它通常发生在我们向函数或方法传递了不合法的参数时。解决这种错误的方法多种多样,关键在于根据具体的情况和代码环境找到最适合的解决方法。以下是一些...
invalid_type_error是在编程中常见的一个错误,它发生在尝试将一个与变量期望类型不符的值赋给变量时。这种类型不匹配的情况会导致程序运行出现错误,因此找到解决此问题的方法至关重要。解决invalid_type_error的...
在处理数据文件时,经常会遇到invalid_format_error,也就是格式错误的问题。这种问题通常出现在解析如CSV、Excel或JSON等文本文件的过程中。格式错误可能是由于数据缺失、格式不符合预期、数据类型不匹配等多种原因...
6. 特殊情况:有时,错误提示“SyntaxError: invalid predicate”可能会在解析特定类型的文件时出现,例如CSV文件。这通常不是因为语法错误,而是因为CSV文件内容不符合预期,导致在使用Python的csv模块解析时引发...
INVALID_JSON_FORMAT(解决方案).md
std::cout << "Invalid operator!" << std::endl; } ``` 3. 输出结果:计算完成后,使用`std::cout`将结果输出到屏幕上。 ```cpp std::cout << "Result: " << result << std::endl; ``` 4. 错误处理:对于可能...
在Oracle数据库系统中,"invalid rowid"错误通常表示尝试访问的数据行的引用已经失效或者不存在。RowID是Oracle数据库中用于唯一标识表中每一行的一个物理地址,它由数据库内部生成并存储在数据块中。当遇到"invalid...
在Python开发过程中,遇到"error: invalid command ‘egg-info‘"这样的报错通常是由于安装或配置Setuptools库时出现了问题。Setuptools是Python项目构建、安装和管理的工具,而`egg-info`命令用于生成项目的元数据...
Invalid Model Path(解决方案).md