16

我有一个带有一些数字字段的类,例如:

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

这篇文章背后的全部原因只是我发现上面的实现太冗长了。应该有更简单的东西。

4

5 回答 5

37

我假设你想实现字典顺序。

在 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);
}
于 2010-06-09T13:51:29.697 回答
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;
于 2010-06-09T14:31:47.703 回答
6

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

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;
    }
}
于 2010-06-09T13:55:23.737 回答
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;
}

作者的“Edit 2”版本平均比这个解决方案有更多的比较。(最坏情况 6 到最坏情况 3)

于 2018-05-19T07:58:41.193 回答
-4

你可以这样做:

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

但这有很多警告-例如没有vtbl,我敢肯定还有更多。

于 2010-06-09T13:54:40.487 回答