低于结构的运算符

Lower than operator for structs

我有一个包含两种数据类型的结构,它们实现了小于、大于和等于运算符。我想为我的结构实现低于运算符:

struct number_pair
{
    int a;
    int b;
    bool operator<(const pair& other) const { return ?; }
}

您需要能够使用运算符对结构的多个实例进行排序。该顺序应同时遵守 ab。我不想使用 std 以外的库,而且我使用的是 C++98,所以 std::tuple 不可用。

两种数据类型只实现小于、大于、等于运算符是否可以达到我想要的效果?如果是这样,运算符的实现会是什么样子,否则,关于实现运算符的数据类型,您还需要了解什么?

为了帮助理解基本概念,请考虑比较两个文本字符串的更简单的情况。问问自己,如何比较两个字符串?你应该知道答案:比较每个字符串的第一个字符。如果它们相同,则转到第二个字符,依此类推。我省略了处理长度不同的字符串的细节,但这是基本的基本概念。

在这里,如果您考虑到您总是有两个字符的字符串,并且在心里用您的 ab:

替换这两个字符,则概念完全相同
bool operator<(const pair& other) const {
   if (a != other.a)
       return a < other.a
   return b < other.b;
}

对于这个简单的用例,这就足够了。在处理模板和其他复杂类型时,出于各种原因,人们通常不得不只使用 < 运算符。如果您对自己施加相同的人为限制,即仅根据 < 本身实施自定义 operator<,则:

bool operator<(const pair& other) const {
   if (a < other.a)
       return true;
   if (other.a < a)
       return false;
   return b < other.b;
}

你想要lexicographical comparison. There's a C++ function for this: std::lexicographical_compare。此算法与用于排序 std::tuple 个对象的算法相同。

您可以自己轻松实现(无需 std::lexicographical_compare),如下所示:

struct pair {
    int a;
    int b;
    bool operator<(const pair& other) const {
        return a < other.a || (a == other.a && b < other.b);
    }
};

或者,您可以使用 std::pair<int, int> 来执行此操作。它已经定义了词典顺序 operator<

虽然std::tuple可能不可用,但您仍然可以使用boost::tuple and boost::tie:

#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>

struct number_pair
{
    int a;
    int b;
    bool operator<(const number_pair& other) const {
        return boost::tie(a, b) < boost::tie(other.a, other.b);
    }
};