std :: map,自定义键类型,仅对一个变量进行排序

Kim*_*-wu 1 c++ std map operators

我有一个密钥类型:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,我并不关心成员变量a,b,c,d,e的排序,我唯一想要确保的是地图按时间戳排序.我也刚刚意识到,如果我有两个KeyT的实例,两个,除了"d"之外一切都是相同的,那么一个<2,两个<1将是假的.解决这个问题的唯一方法是为所有成员变量的所有可能组合编写比较.我很确定我缺少一些明显的东西,那么在这种情况下最好的解决方案是什么?

谢谢!

Ale*_*son 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;
}
Run Code Online (Sandbox Code Playgroud)

如果您想要在可比较的类中排序要优先考虑的变量列表,那么这是一种合理的丑陋模式.

  • 很高兴为您服务.我写了几次.顺便说一句,[boost :: tuple](http://www.boost.org/doc/libs/1_50_0/libs/tuple/doc/tuple_users_guide.html)可用于此类事情.它在`tuple_comparison.hpp`中有一个排序函数,它执行这个优先排序,逐元素排序.我经常使用它来快速和脏的数据排序,而无需编写新的类或订购功能. (2认同)