3

我问我 std::sort 和 std::is_sorted 中的 cmp 函数是如何定义的。

这是 is_sorted_until 的两个文档,怎么说它应该是 operator< :

en.cppreference.com cplusplus.com

但我认为平等元素应该有问题。列表 {1,1,1} 不应排序,因为 1<1==false。但是有一个例子说:

...
int *sorted_end = std::is_sorted_until(nums, nums + N);
...

1 1 4 9 5 3 : 4 个初始排序元素

但如果 < 像记录的那样使用,那应该返回 1。

它可以与 <= 一起使用,但这不是记录的方式。

我真的很困惑。

4

4 回答 4

6

比较需要定义严格的弱排序。严格的弱排序从不可比关系中定义了一组等价类,即如果 x < y 为假,并且 y < x 也为假(即 x 和 y 不能与 < 比较),则认为 x 和 y 是等价的。这些等价类有一个总顺序,这是排序函数产生的总顺序。

在给出的示例中,{1,1,1} 只有一个等价类,即由 {1,1,1} 组成的等价类。

is_sorted_until查找 x[i] < x[i-1] 为真的第一个元素 x[i]。

于 2013-08-21T12:03:14.687 回答
2

确切地说,既不是<也不<=是,默认为std::less。这反过来又需要<大多数类型,除非它是专门的。例如, for 指针通常<不会给出严格的顺序,而 while会。std::less

于 2013-08-21T12:05:16.040 回答
2

operator<除非您提供自定义比较,否则它确实会使用。但是“排序”的定义不是a[n] < a[n+1](我们可以称之为“严格排序”),而是!(a[n+1] < a[n]);所以相等的元素被认为是排序的。这等效于 using <=,但(与所有其他标准算法一样)不需要定义该运算符。

一般来说,所有有序比较都必须定义一个“严格的弱排序”。“严格”表示对等对象的比较必须为假;so<有效,while<=无效。

于 2013-08-21T12:08:17.930 回答
0

如果您查看示例实现,<用于检查下一个元素是否小于前一个元素:

if (*next < *first)
    return next;

如果是,则顺序被破坏,函数返回。IE。逻辑相反 - 如果下一个元素等于前一个元素,则算法不会终止。

于 2013-08-21T12:07:52.850 回答