當我們調用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; }