我的Vec2操作员声明失败<,我不知道出了什么问题。
bool Vec2::operator<( const Vec2& v ) const
{
if(x < v.x)
return true;
else
return y < v.y;
}
无效的运营商&lt;对于std set insert
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);
}
由于
答案 0 :(得分:5)
问题是该运算符不满足弱排序。例如,考虑两点
(2,1)和(1,2)
(2,1)小于(1,2),因为第二个值1小于2.
同时(1,2)也小于(2,1),因为第一个值1小于第一个值2.
看看如何为标准类std :: pair定义thsi运算符并使用相同的运算符。
答案 1 :(得分: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) ;
}
答案 2 :(得分:0)
通常对于这样的比较,你想要比较第一对项目,然后当且仅当它们相等时,比较第二对(依此类推)。
if (x < v.x)
return true;
if (x > v.x)
return false;
return y < v.y;
答案 3 :(得分:0)
operator <
应该满足Strict weak ordering。
完成这项工作的简短方法:
bool Vec2::operator< (const Vec2& v) const
{
return std::tie(x, y) < std::tie(v.x, v.y);
}