2016-06-12 12 views
-1

は、私は、オペレータ<実装では、次のデータがあります。std :: set - 演算子を実装する正しい方法<?

enum eDataSetType 
{ 
    eData1, 
    eData2 
}; 

struct LocationData 
{ 
    bool operator < (const LocationData& other) const 
    { 
     if (mFileName < other.mFileName || 
      mDataSet < other.mDataSet || 
      mChunkId < other.mChunkId || 
      mAnimIndex < other.mAnimIndex) 
     { 
      return true; 
     } 
     return false; 
    } 

    eDataSetType mDataSet; 
    std::string mFileName; 
    Uint32 mChunkId; 
    Uint32 mAnimIndex; 
}; 

をしかしstd::set<LocationData>::insertを使用したとき、私は時々、次のメッセージが出ます:

--------------------------- 
Microsoft Visual C++ Runtime Library 
--------------------------- 
Debug Assertion Failed! 

Program: C:\Windows\system32\MSVCP120D.dll 
File: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtree 
Line: 1795 

Expression: invalid operator< 

For information on how your program can cause an assertion 
failure, see the Visual C++ documentation on asserts. 

(Press Retry to debug the application) 

--------------------------- 
Abort Retry Ignore 
--------------------------- 

はなぜ?

+0

適切な注文を作成していないためです。 –

+1

オペレーターが発注を定義していません。それはごみです。どのようにアイテムを注文したいですか? –

+1

など。あなたのロジックで '(1,0)<(0,1)'と '(0,1)<(1,0)'は真です。 –

答えて

1

私は単にあなたはメンバーがあなたのニーズに注文並べ替えることができますstd::tie

bool operator < (const LocationData& other) const 
{ 
    return std::tie(mFileName, mDataSet, mChunkId, mAnimIndex) < std::tie(other.mFileName, other.mDataSet, other.mChunkId, other.mAnimIndex); 
} 

が提供する辞書式比較を使用します。

+0

これは本当に簡単な方法です – paulm

1

まず、どのようにアイテムを並べ替えるべきかを決めなければなりません。そして、あなたの関数が厳密に弱い順序を提供していることを確認しなければなりません。例えば

、あなたはこのようにあなたの関数を書き換えることができます。

friend bool operator < (const LocationData& a, const LocationData& b) const 
{ 
    if (a.mFileName < b.mFileName)  // sort by filename... 
     return true; 
    else if (a.mFileName > b.mFileName) 
     return false; 
    else { 
     if (a.mDataSet < b.mDataSet)  // then by DataSet... 
      return true; 
     else if (a.mDataSet > b.mDataSet) 
      return false; 
     else { 
      if (a.mChunkId < b.mChunkId) 
       return true; 
      else if (a.mChunkId > b.mChunkId) 
       return false; 
      else 
       return a.mAnimIndex < b.mAnimIndex; 
     } 
    } 
} 
+0

データメンバーは公開されているので、「友人」は必要ありません – coincoin

+0

@coincoinはい、私たちはしません。今、「友人」を削除したり、メンバーの一部を非公開にする方が良いかどうか調べることは興味深いかもしれません... –

+0

ああ、もちろん、私は常にオペレータと混乱します< =代わりに – paulm

関連する問題