std :: is_sorted和严格的比较少?

时间:2013-07-21 04:40:45

标签: c++ sorting c++11 comparator stl-algorithm

我不太了解std::is_sorted算法及其默认行为。如果我们查看cppreference,则表示默认std::is_sorted使用<运算符。而不是那样,我发现使用<=是很自然的。但我的问题是,对于以下数字列表:

1 2 3 3 4 5

即使true应为3 < 3,它也会返回false。怎么可能?

编辑:它似乎比我想象的更糟糕,因为在这种情况下传递std::less_equal<int>将返回false ...当我传递比较器函数时应用的条件是什么?

3 个答案:

答案 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
相关问题