1

キータイプがあります:

struct KeyT {
    uint32_t timestamp;

    // example!
    uint32_t a;
    uint32_t b;
    uint32_t c;
    uint32_t d;
    uint32_t e;
    // ...

    bool operator== (const KeyT& key) const
    {
        if(timestamp == key.timestamp && a == key.a && b == key.b && d == key.d && c == key.c && e == key.e)
            return true;
        return false;

    }
    bool operator< (const KeyT& key) const
    {
        if(timestamp < key.timestamp)
            return true;
        else if(timestamp == key.timestamp && a < key.a && b < key.b && c < key.c && d < key.d && e < key.e)
            return true;
        else if(timestamp == key.timestamp && a == key.a && b < key.b && c < key.c && d < key.d && e < key.e)
            return true;
        else if(timestamp == key.timestamp && a == key.a && b == key.b && c < key.c && d < key.d && e < key.e)
            return true;
        else if(timestamp == key.timestamp && a == key.a && b == key.b && c == key.c && d < key.d && e < key.e)
            return true;
        else if(timestamp == key.timestamp && a == key.a && b == key.b && c == key.c && d == key.d && e < key.e)
            return true;
        // ..
        return false;
    }
};

ここで、メンバー変数 a、b、c、d、e の並べ替えについてはあまり気にしません。確実にしたいのは、マップがタイムスタンプで並べ替えられることだけです。また、「d」以外はすべて同じである KeyT one、two のインスタンスが 2 つある場合、one < two と two < one の両方が false になることにも気付きました。それを修正する唯一の方法は、すべてのメンバー変数のすべての可能な組み合わせの比較を作成することです..明らかに何かが欠けていると確信しています.この場合の最善の解決策は何ですか?

ありがとう!

4

3 に答える 3

6

私はこれがあなたが必要とすることをすると思います:

bool operator< (const KeyT& key) const
{
    if(timestamp != key.timestamp) return timestamp < key.timestamp;
    else if ( a != key.a ) return a < key.a;
    else if ( b != key.b ) return b < key.b;
    else if ( c != key.c ) return c < key.c;
    else if ( d != key.d ) return d < key.d;
    else return e < key.e;
}

これは、同等のクラス内でソートしたい変数の優先順位付きリストがある場合はいつでも使用する、見苦しいパターンですが賢明です。

于 2012-07-03T19:13:35.323 に答える
1

まず、以下のように比較されていない次の現在のキーのみを比較し、次のようにelse後を削除する必要があります。return

bool operator< (const KeyT& key) const
{
    if(timestamp < key.timestamp)
        return true;
    if(timestamp == key.timestamp && a < key.a)
        return true;
    if(timestamp == key.timestamp && a == key.a && b < key.b)
        return true;
    if(timestamp == key.timestamp && a == key.a && b == key.b && c < key.c)
        return true;
    if(timestamp == key.timestamp && a == key.a && b == key.b && c == key.c && d < key.d)
        return true;
    if(timestamp == key.timestamp && a == key.a && b == key.b && c == key.c && d == key.d && e < key.e)
        return true;
    // ..
    return false;
}

タイムスタンプのみを比較する必要がある場合は、最初のを残しif、残りのタイムスタンプを削除します。

bool operator< (const KeyT& key) const
{
    return timestamp < key.timestamp;
}

この演算子を使用してキーを比較する場合、同じタイムスタンプを持つアイテムは並べ替えられません。

于 2012-07-03T19:15:55.850 に答える
0

タイムスタンプだけを気にし、他の属性が問題にならない場合は、厳密な弱い順序付けである次を使用できます。同じタイムスタンプのオブジェクトがどの順序で表示されるかはわかりません。

bool operator< (const KeyT& key) const
{
    return timestamp < key.timestamp;
}

私が提案するすべての属性で注文する必要がある場合boost::tie:

bool operator< (const KeyT& key) const
{
    return boost::tie(timestamp, a, b, c, d, e) < boost::tie(key.timestamp, key.a, key.b, key.c, key.d, e.key);
}
于 2012-07-03T19:32:34.027 に答える