1,弱序关系
弱序关系指集合A中的自反的、传递的、连通的二元关系R。
弱序关系R对任何a,b∈A,有aRb或bRa,A称为弱序集,
全序是一种弱序,弱序若还是反对称的,则就是全序。
2,严格弱序关系
(我没找到定义,以下皆为我的推测)
严格弱序关系指集合A中的反自反的、传递的、连通的二元关系R。
严格弱序关系是拟序的一种,拟序如果连通就是严格弱序关系。
严格弱序 = 全序 - I ,全序 = 严格弱序 + I
在C++编程中,我们经常自定义排序函数,基本上都会写成2种情况,要么就是全序,要么就是严格弱序。
如果是在STL里面使用自定义排序函数,比如 sort 函数或者 priority_queue 里面,就必须使用严格弱序(strict weak ordering),也就是说,比较2个相同的元素时必须return false
sort源码里面有一段是这样的:
while (_First < _Pfirst
&& !_DEBUG_LT_PRED(_Pred, *(_Pfirst - 1), *_Pfirst)
&& !_Pred(*_Pfirst, *(_Pfirst - 1)))
--_Pfirst;
while (_Plast < _Last
&& !_DEBUG_LT_PRED(_Pred, *_Plast, *_Pfirst)
&& !_Pred(*_Pfirst, *_Plast))
++_Plast;
即用 !pred(x,y) && !pred(y,x) 推出x==y,所以pred只能是小于,不能是小于等于。
priority_queue里面应该原理差不多。
用这个版本的sort函数做严格弱序测试:
bool cmp(int a,int b)
{
return a<=b;
}
int main()
{
int arr[5]={1,3,2,6,2};
sort2(arr,arr+5,cmp);
return 0;
}
结果:
然而,我在一次演示的时候翻车了,运行这个代码的结果是正常的:
然后我看了源码,发现内部的sort函数实现方法果然差异很大。