每当我尝试对导致无限循环的对象矢量进行排序时,我就遇到了一个问题。我正在使用我传递给sort函数的自定义比较函数。
我能够通过在两个对象相等而不是true时返回false来解决问题,但我不完全理解解决方案。我认为这是因为我的比较功能违反了cplusplus.com上列出的这条规则:
比较功能对象, 取两个相同类型的值 比那个范围内的那些, 如果是第一个参数,则返回true 在第二个参数之前 特定的严格弱点它 定义,否则为false。
有人能提供更详细的解释吗?
答案 0 :(得分:6)
如果您正在寻找详细解释“严格弱序”的内容,请阅读以下材料:Order I Say!
如果您正在寻找修复比较仿函数的帮助,则需要实际发布。
答案 1 :(得分:6)
如果项目相同,则一个不会先于另一个。文档非常清楚地说明在这种情况下你应该返回false
。
答案 2 :(得分:6)
正如其他人所指出的那样,正确的答案是要了解“严格的弱秩序”是什么。特别是,如果comp(x,y)
为真,那么comp(y,x)
必须为假。 (请注意,这意味着comp(x,x)
为假。)
这就是解决问题所需要知道的全部内容。如果您的比较函数违反规则,sort
算法根本不做任何承诺。
如果您对实际出错的情况感到好奇,那么您的图书馆的sort
例程可能会在内部使用快速排序。 Quicksort通过在序列中反复找到一对“乱序”元素并交换它们来工作。如果您的比较告诉算法a,b是“乱序”,并且它还告诉算法b,a是“乱序”,那么算法可以最终来回交换它们。
答案 3 :(得分:3)
实际规则在C ++标准的25.3[lib.alg.sorting]/2
比较用作函数对象,如果第一个参数小于第二个参数,则返回
true
,否则返回false
。
参数相等的情况属于“否则”。
答案 4 :(得分:1)
排序算法很容易循环,因为你说的是A< B和B<当他们平等的时候。因此,算法可以无限地尝试交换元素A和B,试图以正确的顺序获取它们。
答案 5 :(得分:0)
Strict weak ordering表示< b == true,当你为了相等而返回true时,a< = b == true。对于不同排序算法的最优性,需要此要求。