如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?



许多C++标准算法,如std::sort(),假设比较器comp是一个严格的弱排序,不能假设comp具有任何其他(不错的(属性。但很多时候comp确实具有更多的属性,而不仅仅是严格的弱排序。特别是,很多时候comp是一个严格的总序(所以特别是,对于所有ab,正好以下之一总是正确的:comp(a, b)comp(b, a)a = b(。例如,浮点数、整数和std::string的常用operator<()都是严格的总阶数。

通过将自身限制为假设comp是严格的弱排序,C++标准库是否将自己限制为使用非最佳算法?换句话说,如果C++标准算法假设比较器是严格的总排序,而不仅仅是严格的弱排序,那么一些标准算法会比目前实现的更快吗?

更新:为了更准确地说明"严格总排序"的含义,让我们假设 STL 假设comp(对类型T的对象进行操作(具有operator<()int上具有的所有不错的顺序理论属性。(因此,如果您愿意,我们也可以假设在T类型的对象上也定义了符合您期望的operator==();此假设是可选的,如果您愿意,您可以做出不同的假设。任何STL算法都可以做得更快吗?

更一般地说,如果STL对comp做出"更好"的假设(即假设超过这个假设comp只是一个严格的弱排序(,那么STL算法是否可以做得更快?

例如

,浮点数、整数和浮点数的常用operator<()std::strings都是严格的总订单。

所以你只是在谈论状态的相似性,而不是真正的平等(无论在具有可变状态的语言中是什么(。

通过将自身限制为仅假设 comp 是严格的弱 排序,C++标准库是否限制自身

不。前提错了。容器和算法库(生成排序序列的算法、在排序范围上运行的算法以及有序关联容器(根据定义不会以任何方式限制自身:它明确表示,据我所知没有命名的等价关系(我们称之为Sim(可以用比较 Comp 来定义:

模拟 (x,y( <=> !Comp(x,y( && !Comp(y,x(

所以你有严格的顺序,只需称 Sim 为"平等",超载operator==定义为Sim

所以唯一的问题是使用二进制比较函数的愚蠢,这意味着多次扫描 f.ex. 字符串以确定相等性,并且无法访问三元比较(如strcmp(。如果您可以直接访问 Sim,在平等的情况下,您仍然会称 Comp 而不是Sim,或者称 Comp 然后调用另一个Comp

只有当你先验地怀疑"平等"是最有可能的结果时,你才会使用模拟然后是Comp。这是荒谬的。

三路更适合比较序列。走三条路。

最新更新