许多C++标准算法,如
通过仅假设
更新:为了更准确地说明“严格的全序关系”的含义,让我们假设STL假定
更一般地说,如果STL对
std::sort()
,假定比较器comp
是一个严格弱序,不能假定comp
有任何其他(好的)属性。但很多时候,comp
确实具有更多的属性,不仅仅是一个严格弱序。特别地,很多时候comp
是一个严格全序(因此特别地,对于所有a
和b
,以下情况中恰好有一个始终为真:comp(a, b)
,comp(b, a)
或a = b
)。例如,通常在浮点数、整数和std::string
上的operator<()
都是严格全序。通过仅假设
comp
是严格弱序,C++标准库是否限制了自己使用不太优化的算法?换句话说,如果C++标准算法假定比较器是严格的全序关系而不仅仅是严格的弱序关系,那么一些标准算法是否会比当前实现的更快?更新:为了更准确地说明“严格的全序关系”的含义,让我们假设STL假定
comp
(操作类型为T
的对象)具有所有漂亮的序理论属性,就像int
上的operator<()
一样。(因此,如果您愿意,我们还可以假设在类型为T
的对象上定义了operator==()
,它的工作方式与您期望的相同;这个假设是可选的,如果您愿意,您可以做出不同的假设。)是否有任何STL算法可以更快地运行?更一般地说,如果STL对
comp
进行了“更好的”假设(即假设不仅仅是comp
是一个简单的严格弱序关系),那么是否有任何STL算法可以更快地运行?
std::strong_ordering
,这是严格总序比较的新返回类型。请参见https://en.cppreference.com/w/cpp/language/default_comparisons。 - NathanOliverNaN
,浮点数上的operator<
不是严格的排序。 - n314159Comparator
具有完全排序,如果您没有这样做,排序方法可能会抛出异常。这意味着浮点类型的排序方法对NaN进行特殊处理,将其与正常比较运算符进行不同的比较。我不确定为什么Java需要完全排序。 - Boann