我不太了解std::is_sorted
算法及其默认行为。如果我们查看cppreference,则表示默认std::is_sorted
使用<
运算符。而不是那样,我发现使用<=
是很自然的。但我的问题是,对于以下数字列表:
1 2 3 3 4 5
即使true
应为3 < 3
,它也会返回false
。怎么可能?
std::less_equal<int>
将返回false ...当我传递比较器函数时应用的条件是什么?
答案 0 :(得分:10)
每25.4 / 5:
如果有的话,序列就比较器
comp
进行排序 指向序列的迭代器i
和任何非负整数n
这样i + n
是指向元素的有效迭代器 序列,comp(*(i + n), *i) == false
。
所以,对于
1 2 3 3 4 5
std::less<int>()(*(i + n), *i)
将为所有false
返回n
,而std::less_equal
将针对案例true
返回3 3
。
答案 1 :(得分:4)
即使您只有<
运算符,您也可以确定两个数字是否相等并不一定相等。
if !(first < second) and !(second < first)
then first equivalent to second
另外,正如paxdiablo的解决方案实际上首先提到的那样,你可以实现is_sorted
作为列表,并不断检查<
是不是真的,如果你真的停止了。
以下是cplusplus.com
中函数的正确行为template <class ForwardIterator>
bool is_sorted (ForwardIterator first, ForwardIterator last)
{
if (first==last) return true;
ForwardIterator next = first;
while (++next!=last) {
if (*next<*first) // or, if (comp(*next,*first)) for version (2)
return false;
++first;
}
return true;
}
答案 2 :(得分:2)
你似乎在假设它正在检查(对于肯定的情况)如果元素N小于元素N + 1,则所有元素都是最后一个。这确实不适用于<
,但您可以使用'技巧'来评估<=
<
和!
:以下两个是等效的:
if (a <= b)
if ((a < b) || (!((b < a) || (a < b)))) // no attempt at simplification.
但是,如果元素N小于第一个元素N-1,则它更有可能检测到(负面情况),以便它可以在发现违规时立即停止。 可以只用<
来完成,类似于(伪代码):
for i = 1 to len - 1:
if elem[i] < elem[i-1]:
return false
return true