當我們調用sort函數進行排序時,中的比較函數如果寫成如下
bool cmp(const int &a, const int &b)
{
if(a!=b)
return a<b;
else
return true;
}
則在待排序列中如果出現相等元素,則會報錯Expression : invalid operator <
原因是,c++編譯器檢測到調用cmp的參數a==b時,c++編譯器會立即用反序參數調用cmp函數,即調用cmp(b,a),來判斷cmp函數是否已經執行了嚴格的弱序規則(a與b相等則位置不被改變)
注意:兩次cmp函數的調用后,都會調用內部的嚴格弱序規則檢測函數(源碼如下)
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
_Ty1& _Left, _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
兩次上述檢測函數的調用,都會因為_Pre函數(即cmp函數)返回true而調用_DEBUG_ERROR2函數。但是_DEBUG_ERROR2有一個特點:只在第二次被迭代調用時輸出錯誤信息。所以,當第二次反序調用cmp時(即cmp(b,a)),程序會報錯:Expression : invalid operator <。
綜上所述,cmp函數的改進寫法如下
bool cmp(const int &a, const int &b)
{
if(a!=b)
return a<b;
else
return false;
}better version:
bool cmp(const int &a, const int &b)
{
return a<b;
}
