【发布时间】:2020-04-17 18:07:29
【问题描述】:
许多 C++ 标准算法,例如 std::sort(),假定 the comparator comp 是 strict weak ordering,并且不能假定 comp 具有任何其他(好的)属性。但很多时候comp 确实有更多的属性,而不仅仅是严格的弱排序。特别是,很多时候comp 是strict total order(所以特别是,对于所有a 和b:comp(a, b)、comp(b, a) 或a = b,以下其中一个总是正确的)。例如,浮点数、整数和std::strings 上的常用operator<() 都是严格的全序。
通过将自身限制为仅假设comp 是严格的弱排序,C++ 标准库是否将自身限制为使用次优算法?换句话说,如果 C++ 标准算法假设比较器是严格的总排序而不是严格的弱排序,那么某些标准算法会比目前实现的更快吗?
更新:为了更准确地了解“严格的总排序”的含义,我们假设 STL 假设 comp(对 T 类型的对象进行操作)具有 @987654341 所具有的所有良好的排序理论属性@ on ints 有。 (因此,如果您愿意,我们还可以假设在 T 类型的对象上定义了一个 operator==(),它可以按您的预期工作;这个假设是可选的,如果您愿意,您可以做出不同的假设。 ) 可以使任何 STL 算法更快吗?
更一般地说,如果 STL 对 comp 做出“更好”的假设(即假设更多 comp 只是严格的弱排序),那么任何 STL 算法都可以做得更快吗?
【问题讨论】:
-
@curiousguy cc Matt,在 C++20 之前,您必须自己制作。在 C++20 中,您可以检查返回类型是否为
std::strong_ordering,这是严格总订单比较的新返回类型。见en.cppreference.com/w/cpp/language/default_comparisons -
请注意,由于
NaN,浮点数上的operator<不是严格的排序。 -
@n314159 你不必使用这些非值。
-
不知道有没有用,因为我不是很懂,但是Java要求
Comparators有总排序,如果不这样做,@ 987654325@。这意味着浮点类型的排序方法对 NaN 进行了特殊处理,将其与普通比较运算符进行了不同的比较。我不确定为什么 Java 需要总排序。 -
@JaMiT 我开发了一种算法,如果比较器是一个总订单,则可以更有效地实现该算法。所以我想知道是否有任何 STL 算法存在类似的情况。
标签: c++ algorithm std comparator