前言
永远让比较函数对相等的值返回false
sort函数的cmp必须按照规定来写,即必须只是 > 或者 <
比如: return a > b; return a < b;
而不能是 <= 或者 >= ,(实际上等于号加了也是毫无意义,sort是不稳定的排序),否则可能会出现段错误
严格弱序的定义:如果两个元素具备任何一个元素都不小于另一个元素的性质,那么就视为它们是具备某种程度之等价关系是合理的。公式:!(x<y) && !(y<x) , 广义上 !op(x,y) && !op(y,x) (op(x,y) 表示比较x和y)
为什么要严格弱序?
对于sort中排序函数,如果不遵守严格弱序,那么在根据pivot调整元素顺序时,
while (__comp(*__first, __pivot)) ++__first; 中++__first会越界。导致程序崩溃。
while (true)
{
while (__comp(*__first, __pivot))
++__first;
--__last;
while (__comp(__pivot, *__last))
--__last;
if (!(__first < __last))
return __first;
std::iter_swap(__first, __last);
++__first;
}
对于有序且无重复元素的关联容器(例如,set,map),向里面插入两个相同元素时,
如果定义的比较函数不是严格弱序的话(而是 在<= 情况下,返回true),
由于stl判断相等是使用的 !Cmp(a,b) && !Cmp(b,a),那么当a 和b 相等时,
stl判断相等会返回false,被认为这两个元素值不同的,这是错误的。
所以比较函数需要遵守严格弱序原则,换句话说,永远让比较函数对相等的值返回false
错误使用示例
参考资料:
https://blog.csdn.net/bichenggui/article/details/4705472
https://segmentfault.com/a/1190000018461090
《Effective STL》 条款21: 永远让比较函数对相等的值返回false
《c++标准程序库》 P176
《泛型编程与STL》第六章
https://blog.csdn.net/llz62378/article/details/88937139