许多 C++ 标准算法,例如std::sort(),假设比较器comp是严格的弱排序,并且不能假设它comp具有任何其他(好的)属性。但很多时候comp确实有更多的属性,而不仅仅是严格的弱排序。特别是, many timescomp是严格的全序(因此,特别是,对于所有a和b: comp(a, b)、comp(b, a)、 或,以下条件之一始终为真a = b)。例如,通常operator<()的浮点数、整数和std::strings 都是严格的全序。
通过将自身限制为仅假设这comp是一个严格的弱排序,C++ 标准库是否将自身限制为使用非最佳算法?换句话说,如果 C++ 标准算法假设比较器是严格的总排序而不是严格的弱排序,那么某些标准算法会比当前实现的算法更快吗?
更新:更确切的什么“严总序”的意思,让我们假设STL假设comp(对类型的对象操作T)把所有的美好秩序论的属性,这些属性operator<()在intS有。(因此,如果您愿意,我们还可以假设operator==()在类型对象上也有一个T按您预期工作的定义;这个假设是可选的,如果您愿意,您可以做出不同的假设。)任何 STL 算法都可以吗?做得更快?
更一般地说,如果 STL 做出了“更好”的假设comp(即假设comp不仅仅是严格的弱排序),那么任何 STL 算法都可以做得更快吗?
在 C++17(标准 ISO/IEC 14882:2017(E))中,已排序和非递减的术语不相同:
的序列[first, last)被说成是在非递减次序相对于一个比较器comp,如果为任何迭代器it在[first, last)比其他first的条件comp(*it, *(it - 1))(即,*it < *(it - 1))的计算结果为false。(参见 ISO/IEC 14882:2017(E) 28.7.5 第 1035 页)
请注意,非递减不是定义为:“每当迭代器it和it + 1在[first, last)然后*it <= *(it + 1)”(运算符 <= 甚至不需要定义;同理 for operator==)。
的序列被说成是排序相对于一个比较器comp,如果为任何迭代器it指向序列和任何非负整数n,使得it + n是一个有效的迭代器指向序列的元素,comp(*(it + …