2014-01-07 85 views
1

我得到了關於我的Vec2的操作員<斷言失敗,但我不知道什麼是錯誤的。我的操作員有什麼問題?

bool Vec2::operator<(const Vec2& v) const 
{ 
    if(x < v.x) 
     return true; 
    else 
     return y < v.y; 
} 

無效操作<性病組插入

template<class _Pr, class _Ty1, class _Ty2> inline 
    bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, const _Ty1& _Left, const _Ty2& _Right, 
     const wchar_t *_Where, unsigned int _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<", _Where, _Line); 
    return (true); 
    } 

感謝

+2

有什麼說法? –

+0

無效的運算符<用於std set insert – jmasterx

+0

[可能的重複?](http://stackoverflow.com/questions/9040689/stl-less-operator-and-invalid-operator-error) –

回答

4

的問題是,該運營商不滿足弱排序。例如,考慮兩個點

(2,1)和(1,2)

(2,1)是小於(1,2),因爲第二值1小於2

同時(1,2)也小於(2,1),因爲第一個值1小於第一個值2.

看看如何爲標準類std :: pair定義操作符並使用同一個操作員。

1

修正的方式來滿足排序是:

bool Vec2::operator<(const Vec2& v) const 
{ 
    if(x < v.x) 
     return true; 
    if(x > v.x) 
     return false; 
    else   
     return y < v.y; 
} 

或(代碼高爾夫球模式):

bool Vec2::operator<(const Vec2& v) const 
{ 
    return (x != v.x)? (x < v.x) 
        : (y < v.y) ; 
} 
0

通常對於這樣的比較,要比較第一對項目,那麼當且僅當這些相等時,比較第二對(依此類推)。

if (x < v.x) 
    return true; 
if (x > v.x) 
    return false; 
return y < v.y; 
0

operator <應該滿足Strict weak ordering

短的方式來完成這項工作:

bool Vec2::operator< (const Vec2& v) const 
{ 
    return std::tie(x, y) < std::tie(v.x, v.y); 
}