我们的游戏引擎使用STL sort
使用模板sort
函数对整个范围的不同对象进行排序。据我所知,比较逻辑的要求是你必须在内部进行反向排序的基础上编写它(即反转配对,例如从(a,b)
到(b,a)
)。
所以我的比较函数通常如下所示:
bool CompareSubGroupReqsByDescendingFillPriority::operator()
( const ScenSubGroupReq& lhs,
const ScenSubGroupReq& rhs ) const
{
if( lhs.mFillPriority > rhs.mFillPriority ) return true;
else if( lhs.mFillPriority < rhs.mFillPriority ) return false;
else return lhs.mForceGroup->ObjectID() > rhs.mForceGroup->ObjectID();
}
我将“else”声明称为“交易破坏者” - 即。它必须能够解决lhs和rhs都相同的情况。我通常使用对象ID来排序持久对象。
我的问题是,当您对非简单数据类型的非持久对象(例如短路)进行排序时,如何创建交易断路器?
以下是我与之搏斗的例子:
bool
ComparePhaseLineIndexesByAscendingValue::operator() ( const short lhs,
const short rhs ) const
{
if( lhs < rhs ) return true;
else if( lhs > rhs ) return false;
else
{
// should never be here as no two phase lines should have the same index
FPAssert( false );
return false;
}
}
麻烦是我一直在测试这个并找到一个有效的案例,其中我可以有两个具有相同索引的相位线。我不关心哪个具有相同值的条目首先结束。
你会建议什么?
答案 0 :(得分:1)
从技术上讲,sort函数采用的是less运算符。您要做的似乎与确保以特定顺序返回甚至相等的对象有关。通常你会这样做
bool
ComparePhaseLineIndexesByAscendingValue::operator() ( const short lhs,
const short rhs ) const
{
return lhs < rhs;
}
虽然内置类型通常不需要比较函数(我认为它是指定了&lt;运算符的任何类型)。