0

私たちのゲーム エンジンはsort、テンプレートsort関数を使用してさまざまなオブジェクトの全範囲を並べ替えるために STL を使用します。私が理解しているように、比較ロジックの要件は、内部的に逆の並べ替えを行う可能性があることに基づいて記述する必要があることです (つまり、 from から(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;
    }
}

問題は、これをテストしていて、同じインデックスを持つ 2 つのフェーズ ラインを持つことができる有効なケースを見つけたことです。同じ値を持つエントリのどれが最初に終わるかは気にしません。

何をアドバイスしますか?

4

1 に答える 1

1

技術的には、ソート関数はより小さい演算子を取ります。あなたがやろうとしていることは、等しいオブジェクトでさえ特定の順序で返されることを確実にすることと関係があるようです。一般的にあなたはただするでしょう

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

通常、組み込み型には比較関数は必要ありません(<演算子が指定されている型ならどれでもいいと思います)。

于 2012-09-25T06:10:05.953 に答える