c – 自定义比较器 – 将“<=”保存交换“<”?

假设我有一个自定义的多标准比较器,尽管多部分可能并不重要.为了简单起见,我们假设我们正在排序由3个表示坐标的双精度组成的数组.

我知道go-to比较运算符是“<”,但我有这种唠叨的感觉,如果所有部分相等,“< =”可能会保存交换.分拣机(例如std :: sort)是否会,“嘿,如果比较器返回false,我正在交换你!”,或者这是不正确的假设?谢谢.

// Compare based on X,then Y,then Z
bool PointComparer(const array<double,3>& a,const array<double,3>& b)
{
    if (a[0] < b[0]) return true;
    if (a[0] > b[0]) return false;

    if (a[1] < b[1]) return true;
    if (a[1] > b[1]) return false;

    return a[2] < b[2];  // If instead was a[2] <= b[2],would it save a swap in equal case?
}
// Later sort a collection of these arrays

解决方法

你不能使用< = for std :: sort()和类似的标准算法,因为它不满足需要 strict weak orderingCompare concept并且违反了这个条件:

For all x in S,it is not the case that x < x (irreflexivity).

所以使用这个运算符会导致UB,如果它会阻止交换,那就毫无意义.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...