实施运算符<在C ++中

时间:2010-06-09 13:48:30

标签: c++ operators operator-overloading operator-keyword

我有一个包含几个数字字段的类,例如:

class Class1 {
    int a;
    int b;
    int c;
public:
    // constructor and so on...
    bool operator<(const Class1& other) const;
};

我需要将此类的对象用作std::map中的键。因此,我实施operator<。在这里使用operator<的最简单的实现是什么?

修改 只要任何字段不相等,就可以假设<的含义以保证唯一性。

编辑2:

简单的实施:

bool Class1::operator<(const Class1& other) const {
    if(a < other.a) return true;
    if(a > other.a) return false;

    if(b < other.b) return true;
    if(b > other.b) return false;

    if(c < other.c) return true;
    if(c > other.c) return false;

    return false;
}

这篇文章背后的全部原因只是我发现上面的实现过于冗长。应该有更简单的事情。

5 个答案:

答案 0 :(得分:34)

我假设你想要实现词典排序。

在C ++ 11之前:

#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
bool Class1::operator<(const Class1& other) const
{
    return boost::tie(a, b, c) < boost::tie(other.a, other.b, other.c);
}

从C ++ 11开始:

#include <tuple>
bool Class1::operator<(const Class1& other) const
{
    return std::tie(a, b, c) < std::tie(other.a, other.b, other.c);
}

答案 1 :(得分:15)

我认为对map要求的内容存在误解。

map不要求您的班级定义operator<。它需要传递合适的比较谓词,方便地默认为std::less<Key>operator<使用Key

您不应实施operator<以使您的密钥适合map。只有在为这个类定义它时才应该实现它:即它是否有意义。

您可以完美地定义谓词:

struct Compare: std::binary_function<Key,Key,bool>
{
  bool operator()(const Key& lhs, const Key& rhs) const { ... }
};

然后:

typedef std::map<Key,Value,Compare> my_map_t;

答案 2 :(得分:4)

这取决于订购对您来说是否重要。如果没有,你可以这样做:

bool operator<(const Class1& other) const
{
    if(a == other.a)
    {
         if(b == other.b)
         {
             return c < other.c;
         }
         else
         {
             return b < other.b;
         }
    }
    else
    {
        return a < other.a;
    }
}

答案 3 :(得分:0)

避免多次缩进的版本是

bool operator<(const Class1& other) const
{
    if(a != other.a)
    {
        return a < other.a;
    }

    if(b != other.b)
    {
        return b < other.b;
    }

    return c < other.c;
}

&#34;编辑2&#34;作者的版本平均比这个解决方案有更多的比较。 (最坏情况6到最差情况3)

答案 4 :(得分:-4)

你可以这样做:

return memcmp (this, &other, sizeof *this) < 0;

但这有很多警告 - 例如没有vtbl,而且我确定更多。