c ++ std :: vector std :: sort无限循环

时间:2011-06-02 18:19:17

标签: c++ sorting stdvector

每当我尝试对导致无限循环的对象矢量进行排序时,我就遇到了一个问题。我正在使用我传递给sort函数的自定义比较函数。

我能够通过在两个对象相等而不是true时返回false来解决问题,但我不完全理解解决方案。我认为这是因为我的比较功能违反了cplusplus.com上列出的这条规则:

  

比较功能对象,   取两个相同类型的值   比那个范围内的那些,   如果是第一个参数,则返回true   在第二个参数之前   特定的严格弱点它   定义,否则为false。

有人能提供更详细的解释吗?

6 个答案:

答案 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。对于不同排序算法的最优性,需要此要求。