2

これはコードです:

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;
    }
};

そして、これが問題です:

デバッグ アサーションに失敗しました!
ファイル: ..\VC\include\xtree
行: 638

式: 無効な演算子 <

その後、「中止」、「再試行」、または「無視」を選択できます。無視を選択すると、さらに多くの(同一のもの)が出てきますが、完全に機能します。

->Amount == で Reputation を以前に挿入された Reputation * の 1 つに挿入すると、問題が発生するようですが、この最後のものについてはわかりません。

どんな助けでも大歓迎です

編集:私がそれらを並べたい順序は、最初に昇順の正のもの、次に降順の負のものです。例: 1 5 10 11 11 20 50 -1 -5 -50

4

3 に答える 3

6

のように、非反射的なリレーションを定義する必要があります。<したがって、メソッドの最後の比較で<=toと '>=' を '>' に変更します。<これは、VC++ が診断しているものです。

さらに、正しくコーディングされた<-like 演算子が与えられた場合、2 つの項目 a と b が a < b と b < a の両方が false である場合、これらの項目は同等と見なされ、セットに挿入されるのは 1 つだけです (アイテムは他の比較によって区別できます。比較対象によって暗示される同等関係のみが重要です)。

于 2009-06-30T00:07:25.330 に答える
0

std::set に同じ値を挿入することはできません。一意の値が必要です。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;
    }
};
于 2009-06-30T00:04:40.827 に答える