2009-06-29 4 views
2

これはコードです:C++のstd ::設定コンパレータ

struct comp 
{ 
    bool operator()(Reputation *one, Reputation *two) 
    { 
     if (one->Amount < 0 && two->Amount >= 0) 
      return false; 
     if (one->Amount >= 0 && two->Amount < 0) 
      return true; 

     if (one->Amount >= 0) 
      return one->Amount <= two->Amount; 
     else 
      return one->Amount >= two->Amount; 
    } 
}; 

そして、これが問題である:

デバッグアサートに失敗しました! 638

式:\のXtree
ライン含める.. \ VC \:
ファイルその後、無効なオペレータ<

を、私は "再試行" または "無視"、 "中止" を選択することができます。私が無視することを選択した場合、より多くのもの(同一のもの)が出てくるが、完璧に仕上がってしまう。

以前に挿入されたレピュテーションの*に「レピュテーション」を挿入すると問題が発生するようですが、この最後のものについてはわかりません。

は、すべてのヘルプは大幅に

EDITをいただければ幸いです。私は彼らがで注文する順序は、最初のASC順に、正のもの、降順順に、負のものです。例:1 5 10 11 11 20 50 -1 -5 -50

答えて

6

あなただけの<のように、非反射だ関係を定義する必要があります:あなたの面白い発注については

これが動作しているようですあなたのメソッドの比較の最後のカップルで> '。これはVC++が診断しているものです。

また、与えられた二つのアイテム及びbは、それらのアイテムが等価であると考えられるので、一方のみがセットに挿入され< B及びB <が共に偽であるようなものである場合に正常、オペレータ等<-、符号化されました(項目が他の何らかの比較によって区別されるかどうかは重要ではない:コンパレータの問題によって示唆される同値関係のみ)。

+0

ありがとうございました。とても有難い! –

+0

喜んで私は "デバッグアサーション失敗"問題を修正するのを手伝ったが、 "一意性"に関する私の最新の編集を読んでください - @ Kasprzolのようにマルチセットを必要とするのは、コンパレータ_。 –

+0

はい、私は既にKasprozlのアドバイスに従ってマルチセットに変換しました! –

1

std::setの項目は一意でなければなりません! (そしてそれほど匹敵しない)あなたが提供したサンプルのように、同じ値を持つ複数のアイテムを持つ場合は、std::multisetを使用します。

は、以下を参照してください。あなたが同じのstd ::への値のセットを挿入することはできませんhttp://www.cppreference.com/wiki/stl/set/starthttp://www.cppreference.com/wiki/stl/multiset/start

+0

std :: multisetに変換しましたが、同じ問題が発生します。 –

0

、それが一意の値が必要です。 std :: multisetを使用します。 'とそれゆえ、<<=を変更し、「> =」 -

struct comp 
{ 
    bool operator()(const Reputation *a, const Reputation *b) 
    { 
     if (a->Amount < 0 && b->Amount < 0) 
      return a->Amount > b->Amount; 
     else if (a->Amount < 0) return false; 
     else if (b->Amount < 0) return true; 
     else return a->Amount < b->Amount; 
    } 
}; 
+0

セットはポインタのセットです。同じものを持っていても、それらはすべてユニークです - >金額。 これは正確なコードです: \t multiset sorted; \t for(Reputation * rep = Reputation :: GetReputationTable(); rep-> Id; ++ rep) \t \t sorted.insert(rep); –

+0

ああ、例からは分かりませんでしたが、ポインタを使用してポインタを格納する場合はええ – stefanB

関連する問題