如何在c ++中定义cmp?与<或者用< =?

时间:2013-08-21 11:58:24

标签: c++ sorting stl compare

我问我如何定义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个初始排序元素

但如果&lt;像记录一样使用。

它适用于&lt; =,但这不是记录的方式。

我真的很困惑。

4 个答案:

答案 0 :(得分:6)

需要进行比较以定义strict weak ordering。严格的弱排序根据不可比性关系定义一组等价类,即,如果x <1。 y是假的,y&lt; x也是假的(即x和y不能与&lt;)相比,x和y被认为是等价的。这些等价类具有总顺序,这是排序函数产生的总顺序。

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

is_sorted_until找到第一个元素x [i],其中x [i]&lt; x [i-1]是真的。

答案 1 :(得分:2)

确切地说,它既不是<也不是<=,它默认为std::less。对于大多数类型,它会依次调用<,除非它是专门的。例如,<指针不会通常给出严格的排序,而std::less会这样做。

答案 2 :(得分:2)

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

通常,所有有序比较都必须定义“严格弱排序”。 “严格”意味着对于等效对象,比较必须是假的;因此<有效,而<=则无效。

答案 3 :(得分:0)

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

if (*next < *first)
    return next;

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