求问重载运算符

P1417 烹调方案

Brilliant11001 @ 2024-11-01 19:15:45

主要是推式子的时候反了一下

bool operator< (const node &o) const{
    return (ll)c * o.b < (ll)o.c * b;
}

这么写 #20 不会 RE。

bool operator< (const node &o) const{
    return (ll)o.c * b >= (ll)c * o.b;
}

这么写就 RE 了,数组开多大都没用。

请问这是为什么呢?


by Hagasei @ 2024-11-01 19:19:07

sort(或大多数 STL)要求的小于都是严格小于,也就是不能同时成立 a<bb<a。你这个显然不严格。


by Hagasei @ 2024-11-01 19:19:14

@Brilliant11001


by liangbowen @ 2024-11-01 19:20:03

cmp(x,y),或者你的重载同理,需要满足 cmp(x,y)!=cmp(y,x)


by Brilliant11001 @ 2024-11-01 19:21:10

@Hagasei @Hagasei 感谢,已关


by Hagasei @ 2024-11-01 19:21:11

@liangbowen 你说的错。他们可以同时为零。


by Brilliant11001 @ 2024-11-01 19:21:23

@liangbowen


by liangbowen @ 2024-11-01 19:22:04

哦哦,确实 /kel


by Terrible @ 2024-11-01 19:24:08

并不是重载运算符函数的问题哦,可能只是不匹配。

严格地说,std::sort 等的比较谓词需要满足严格弱序,详见比较 (Compare)

当然某些情况下不满足严格弱序可能也能得出结果,不乏有以下几种情况:

  1. 虽然该比较谓词无法提供给待比较集合完整的比较意义,但是能给程序执行时提供涉及的情况提供完整的比较意义。

  2. 由于函数、容器等的具体实现和具体数据结合,没有产生严重错误,并且执行结果正确。

  3. 该函数、容器等明确地不需要严格弱序。

在有明确要求比较谓词满足严格弱序的前提下,做出比较谓词不满足严格弱序的行为是冒险的,可能触及未定义行为。应当避免这种写法,即便这有时候看起来没有问题。


by StarPatrick @ 2024-11-01 19:33:29

@Terrible 你这段话不就是想表达重载严格小于吗


by Terrible @ 2024-11-01 19:40:16

@StarPatrick 您看上具体哪里的错误了?


| 下一页