Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::_是否已排序且严格较少比较?_C++_Sorting_C++11_Comparator_Stl Algorithm - Fatal编程技术网

C++ std::_是否已排序且严格较少比较?

C++ std::_是否已排序且严格较少比较?,c++,sorting,c++11,comparator,stl-algorithm,C++,Sorting,C++11,Comparator,Stl Algorithm,我不太了解std::is_sorted算法及其默认行为。如果我们看一下,它说默认情况下,std::is_sorted使用,即使您只有,您似乎假设它正在检查(对于正数情况)元素N是否小于最后一个元素的元素N+1。如果按照25.4/5的规定,仅使用,这确实不起作用: 序列根据比较器comp排序(如果有) 迭代器i指向序列和任何非负整数n 使得i+n是指向 序列,comp(*(i+n),*i)==false 那么,为了 1 2 3 3 4 5 std::less()(*(i+n),*i)将为所有n返

我不太了解
std::is_sorted
算法及其默认行为。如果我们看一下,它说默认情况下,
std::is_sorted
使用
,即使您只有
,您似乎假设它正在检查(对于正数情况)元素N是否小于最后一个元素的元素N+1。如果按照25.4/5的规定,仅使用
,这确实不起作用:

序列根据比较器
comp
排序(如果有) 迭代器
i
指向序列和任何非负整数
n
使得
i+n
是指向 序列,
comp(*(i+n),*i)==false

那么,为了

1 2 3 3 4 5

std::less()(*(i+n),*i)
将为所有
n
返回
false
,而
std::less_equal
将为case
33
返回
true
我知道,但我认为
std::is_sorted
将为所有
返回
true
(N,N+1)
元素,情况并非如此。@Vincent没有遵循您能否详细说明如果我通过比较器
std::less
,比较将返回:
true
用于
(1,2)
true
用于
(2,3)
,但是
false
用于
(3,3)
,因此我认为算法到此为止(首先检测到
false
)并返回
false
。但事实并非如此。斯科特·迈尔斯(Scott Meyers)的第19项:“理解等价和相等之间的区别”,特别是
!(a
并不意味着
a==b
,但只意味着
a
b
是。对于内置类型,这些概念是一致的,但对于类类型不一定如此。等价性对于分区很有用(例如
std::multiset
容器和
std::partition
算法)相等和等价之间的细微差别是例如:代码>稳定-排序- < /代码>和<代码>排序< /代码>。它根本不是挑剔的(除非你考虑Scott Meyers写)。!我不得不对你的答案投反对票,但如果你改变它以反映这些概念,我会投反对票。好吧,现在这是有意义的,即使这对我来说是违反直觉的。@Vincent,在我查看标准之前,这对我来说也是违反直觉的:)我觉得如果我在所有答案中都有一个标准的引语,我的代表会很高兴higher@aaronman当标准如此清晰时,我认为没有比这更好的答案了。@Vincent我只想指出paxdiablos的答案是第一个答案,我编辑了我的答案,他在没有Scott Meyers引用标准的情况下说了同样的话,是吗em 19:“理解等价与平等之间的区别”
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;
}  
if (a <= b)
if ((a < b) || (!((b < a) || (a < b)))) // no attempt at simplification.
for i = 1 to len - 1:
    if elem[i] < elem[i-1]:
        return false
return true
1 2 3 3 4 5