是否可以为通用元素列表创建排序?
Is it possible to create an ordering for a list of generic elements?
是否可以创建一个函数,该函数接受任何可以想象到的类型的元素列表,并且 returns 一个运算符可以充当对元素进行排序的比较器?换句话说,
template typename<T> ??? getComparator ( T a )
{
// ...
}
我把 ???
放在哪里是因为我不确定 return 类型是什么。然而,我的想法是,如果我调用
getComparator(int i)
可能会 return
bool smallerThan(int a, int b) { return (a < b); }
如果我创建了自定义对象
struct thingamabob { int i; std::string s; int ***** ptr; }
thingamabob myThing;
我可以将 myThing
馈入 getComparator
,它会弄清楚如何创建一个 return 类型 bool
的函数,该函数需要两个 [=24] 类型的对象=] 并且对于任何 3 个对象都是如此
thingamabob thing1, thing2, thing3;
和
thing1 != thing2 && thing2 != thing3 && thing1 != thing3
然后我可以得到一些 <
这样
thing1 <= thing2 && thing2 <= thing3
或
thing1 <= thing3 && thing3 <= thing2
或
thing3 <= thing1 && thing1 <= thing2
或
thing2 <= thing1 && thing1 <= thing3
或
thing2 <= thing3 && thing3 <= thing1
或
thing3 <= thing1 && thing1 <= thing2
或
thing3 <= thing2 && thing2 <= thing3
我很确定您正在寻找 std::less<T>
:这是一个函数对象,它将比较两个 T
类型的对象。
但是,它需要定义 operator<
- 这对 int
可以很好地工作,但对于 thingamabob
- 您必须自己编写该运算符。编译器如何知道你说一个 thingamabob
小于另一个的意思,除非你告诉它?
C++ 中没有此类功能(截至 2015 年,因此包括 C++14 之前的所有标准)。然而,Bjarne Stroustrup 已经写了一份提案,将 default comparison operators 添加到标准中。
这实际上是为您生成一个比较运算符,以防您自己不声明这些运算符。它只是 class / 结构的数据成员的字典顺序。然而,目前这还没有在任何主流编译器中实现,也不确定它是否会被添加到官方 C++ 标准中。您必须坚持自己实施它。
提案定义了一些不会生成默认比较运算符的情况,例如如果有一个指针成员。这是因为这样的比较可能很容易调用未定义的行为。
直接执行此操作的代码是:
bool operator<(const Type& first, const Type& second)
{
return std::tie(first.member1, first.member2) <
std::tie(second.member1, second.member2);
}
bool operator>=(const Type& first, const Type& second)
{
return !(first < second);
}
bool operator>(const Type& first, const Type& second)
{
return second < first;
}
bool operator<=(const Type& first, const Type& second)
{
return !(first > second);
}
是否可以创建一个函数,该函数接受任何可以想象到的类型的元素列表,并且 returns 一个运算符可以充当对元素进行排序的比较器?换句话说,
template typename<T> ??? getComparator ( T a )
{
// ...
}
我把 ???
放在哪里是因为我不确定 return 类型是什么。然而,我的想法是,如果我调用
getComparator(int i)
可能会 return
bool smallerThan(int a, int b) { return (a < b); }
如果我创建了自定义对象
struct thingamabob { int i; std::string s; int ***** ptr; }
thingamabob myThing;
我可以将 myThing
馈入 getComparator
,它会弄清楚如何创建一个 return 类型 bool
的函数,该函数需要两个 [=24] 类型的对象=] 并且对于任何 3 个对象都是如此
thingamabob thing1, thing2, thing3;
和
thing1 != thing2 && thing2 != thing3 && thing1 != thing3
然后我可以得到一些 <
这样
thing1 <= thing2 && thing2 <= thing3
或
thing1 <= thing3 && thing3 <= thing2
或
thing3 <= thing1 && thing1 <= thing2
或
thing2 <= thing1 && thing1 <= thing3
或
thing2 <= thing3 && thing3 <= thing1
或
thing3 <= thing1 && thing1 <= thing2
或
thing3 <= thing2 && thing2 <= thing3
我很确定您正在寻找 std::less<T>
:这是一个函数对象,它将比较两个 T
类型的对象。
但是,它需要定义 operator<
- 这对 int
可以很好地工作,但对于 thingamabob
- 您必须自己编写该运算符。编译器如何知道你说一个 thingamabob
小于另一个的意思,除非你告诉它?
C++ 中没有此类功能(截至 2015 年,因此包括 C++14 之前的所有标准)。然而,Bjarne Stroustrup 已经写了一份提案,将 default comparison operators 添加到标准中。
这实际上是为您生成一个比较运算符,以防您自己不声明这些运算符。它只是 class / 结构的数据成员的字典顺序。然而,目前这还没有在任何主流编译器中实现,也不确定它是否会被添加到官方 C++ 标准中。您必须坚持自己实施它。
提案定义了一些不会生成默认比较运算符的情况,例如如果有一个指针成员。这是因为这样的比较可能很容易调用未定义的行为。
直接执行此操作的代码是:
bool operator<(const Type& first, const Type& second)
{
return std::tie(first.member1, first.member2) <
std::tie(second.member1, second.member2);
}
bool operator>=(const Type& first, const Type& second)
{
return !(first < second);
}
bool operator>(const Type& first, const Type& second)
{
return second < first;
}
bool operator<=(const Type& first, const Type& second)
{
return !(first > second);
}