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
将为case33
返回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