繁体   English   中英

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

[英]c++ std::vector std::sort infinite loop

每当我尝试对导致无限循环的对象向量进行排序时,我都会遇到一个问题。 我正在使用自定义比较 function,我传入排序 function。

当两个对象相等而不是 true 时,我可以通过返回 false 来解决此问题,但我并不完全理解解决方案。 我认为这是因为我的比较 function 违反了 cplusplus.com 上概述的这条规则:

比较 function object 取两个与范围内相同类型的值,如果第一个参数在其定义的特定严格弱排序中位于第二个参数之前,则返回 true,否则返回 false。

谁能提供更详细的解释?

如果您正在寻找“严格弱排序”的详细解释,这里有一些很好的阅读材料:我说的命令!

如果您正在寻求修复比较函子的帮助,则需要实际发布它。

如果项目相同,则一个不在另一个之前 go。 该文档非常清楚地说明在这种情况下您应该返回false

正如其他人指出的那样,正确的答案是了解什么是“严格的弱排序”。 特别是,如果comp(x,y)为真,则comp(y,x)必须为假。 (请注意,这意味着comp(x,x)为假。)

这就是您纠正问题所需要知道的一切。 如果您的比较 function 违反规则,则sort算法根本不会做出任何承诺。

如果您好奇到底出了什么问题,您的库的sort例程可能在内部使用了快速排序。 快速排序通过在序列中重复查找一对“乱序”元素并交换它们来工作。 如果您的比较告诉算法 a,b 是“乱序的”,并且它还告诉算法 b,a 是“乱序的”,那么算法最终可以永远地来回交换它们。

实际规则在 C++ 标准中指定,在25.3[lib.alg.sorting]/2

比较用作 function object 如果第一个参数小于第二个参数,则返回true ,否则返回false

arguments 相等的情况属于“否则”。

排序算法很容易循环,因为您说 A < B AND B < A 当它们相等时。 因此,该算法可能会无限尝试交换元素 A 和 B,试图让它们以正确的顺序排列。

严格的弱排序意味着 a < b == true 并且当您为相等返回 true 时,它的 a <= b == true。 不同排序算法的最优性需要此要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM