低于结构的运算符
Lower than operator for structs
我有一个包含两种数据类型的结构,它们实现了小于、大于和等于运算符。我想为我的结构实现低于运算符:
struct number_pair
{
int a;
int b;
bool operator<(const pair& other) const { return ?; }
}
您需要能够使用运算符对结构的多个实例进行排序。该顺序应同时遵守 a
和 b
。我不想使用 std
以外的库,而且我使用的是 C++98,所以 std::tuple
不可用。
两种数据类型只实现小于、大于、等于运算符是否可以达到我想要的效果?如果是这样,运算符的实现会是什么样子,否则,关于实现运算符的数据类型,您还需要了解什么?
为了帮助理解基本概念,请考虑比较两个文本字符串的更简单的情况。问问自己,如何比较两个字符串?你应该知道答案:比较每个字符串的第一个字符。如果它们相同,则转到第二个字符,依此类推。我省略了处理长度不同的字符串的细节,但这是基本的基本概念。
在这里,如果您考虑到您总是有两个字符的字符串,并且在心里用您的 a
和 b
:
替换这两个字符,则概念完全相同
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);
}
};
我有一个包含两种数据类型的结构,它们实现了小于、大于和等于运算符。我想为我的结构实现低于运算符:
struct number_pair
{
int a;
int b;
bool operator<(const pair& other) const { return ?; }
}
您需要能够使用运算符对结构的多个实例进行排序。该顺序应同时遵守 a
和 b
。我不想使用 std
以外的库,而且我使用的是 C++98,所以 std::tuple
不可用。
两种数据类型只实现小于、大于、等于运算符是否可以达到我想要的效果?如果是这样,运算符的实现会是什么样子,否则,关于实现运算符的数据类型,您还需要了解什么?
为了帮助理解基本概念,请考虑比较两个文本字符串的更简单的情况。问问自己,如何比较两个字符串?你应该知道答案:比较每个字符串的第一个字符。如果它们相同,则转到第二个字符,依此类推。我省略了处理长度不同的字符串的细节,但这是基本的基本概念。
在这里,如果您考虑到您总是有两个字符的字符串,并且在心里用您的 a
和 b
:
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);
}
};