我问我如何定义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; =,但这不是记录的方式。
我真的很困惑。
答案 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。逻辑相反 - 如果下一个元素等于前一个元素,算法不会终止。