【问题标题】:STL Sort with no deal breaker没有交易破坏者的 STL 排序
【发布时间】:2012-09-25 06:04:04
【问题描述】:

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

问题是我一直在对此进行测试,并找到了一个有效的案例,其中我可以有两条具有相同索引的相线。我不在乎哪个具有相同值的条目首先结束。

你有什么建议?

【问题讨论】:

  • 我很难理解这个问题。你的程序在断言处崩溃了?
  • STL 比较器应该为相等的对象返回 false。使用lhs&lt;rhs - 这是STL算法,除了你。

标签: sorting stl


【解决方案1】:

从技术上讲,排序函数采用小于运算符。您尝试做的似乎与确保以特定顺序返回甚至相等的对象有关。通常你会做

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

虽然通常内置类型不需要比较函数(我认为它是任何指定了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多