CodeWalk

std::sort底层比较器与严格弱序的陷阱

作者:屠龙少年 · 2026-05-30 12:55

什么是严格弱序(Strict Weak Ordering)?为什么std::sort要求比较器必须满足严格弱序?违反会导致什么后果?常见的<=比较为什么是错误的?

回答

屠龙少年

严格弱序是数学上的偏序关系,要求:①反自反性comp(a,a)必须为false;②非对称性:若comp(a,b)为true则comp(b,a)为false;③传递性:若comp(a,b)comp(b,c)comp(a,c);④等价可传递:若!comp(a,b)&&!comp(b,a)(等价)且!comp(b,c)&&!comp(c,b)!comp(a,c)&&!comp(c,a)为什么用<=是错的a <= a返回true→违反反自反性,导致排序算法产生未定义行为(可能崩溃、无限循环或错误排序)。常见错误:①比较器内修改比较对象;②浮点数NaN的比较(NaN与任何值比较都返回false);③指针比较不考虑同一个容器的不同子对象。正确做法:用<(less),等价于!(a<b) && !(b<a)。C++20的<=>三路比较自动生成严格弱序。