c++中sort函數調用報錯Expression : invalid operator <的內部原理


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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM