STL排序没有交易破坏者

时间:2012-09-25 06:04:05

标签: sorting stl

我们的游戏引擎使用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;
    }
}

麻烦是我一直在测试这个并找到一个有效的案例,其中我可以有两个具有相同索引的相位线。我不关心哪个具有相同值的条目首先结束。

你会建议什么?

1 个答案:

答案 0 :(得分:1)

从技术上讲,sort函数采用的是less运算符。您要做的似乎与确保以特定顺序返回甚至相等的对象有关。通常你会这样做

bool
ComparePhaseLineIndexesByAscendingValue::operator() (   const short  lhs, 
                                                        const short  rhs ) const
{
    return lhs < rhs;
}

虽然内置类型通常不需要比较函数(我认为它是指定了&lt;运算符的任何类型)。