是否可以为通用元素列表创建排序?

时间:2015-06-05 21:43:46

标签: c++ algorithm data-structures binary-tree

是否可以创建一个函数来获取任何可想象类型的元素列表,并返回一个可以作为比较器来排序元素的运算符?换句话说,

template typename<T> ??? getComparator ( T a )
{
     // ...
}

我放???因为我不确定返回类型是什么。然而,这个想法是,如果我打电话

getComparator(int i)

它可能会返回

bool smallerThan(int a, int b) { return (a < b); }

如果我创建了自定义对象

struct thingamabob { int i; std::string s; int ***** ptr; }
thingamabob myThing; 

我可以将myThing提供给getComparator,它会弄清楚如何创建一个返回类型为bool的函数,它接受两个myThing类型的对象,就是这样的对于任何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

2 个答案:

答案 0 :(得分:1)

我很确定你正在寻找std::less<T>:这是一个比较两个T类型对象的函数对象。

但是,它需要定义operator< - 这对于int可以正常工作,但对于thingamabob - 您必须自己编写该运算符。如果一个thingamabob比另一个 environment.getApplicationContext().addServlet(new ServletHolder(new BaseServlet()), "/login"); environment.getApplicationContext().addServlet(new ServletHolder(new BaseServlet()), "/my-leagues"); environment.getApplicationContext().addServlet(new ServletHolder(new BaseServlet()), "/registering-leagues"); environment.getApplicationContext().addServlet(new ServletHolder(new BaseServlet()), "/league-register/*"); 少,除非你告诉它,编译器如何知道你的意思?

答案 1 :(得分:0)

C ++中没有这样的功能(截至2015年,因此包括所有标准,直到C ++ 14)。但是,Bjarne Stroustrup已经提出了将default comparison operators添加到标准中的建议。

这基本上是为您生成比较运算符,以防您不自行声明这些运算符。它只是您的类/结构的数据成员的词典排序。但是,这在目前的任何主流编译器中都没有实现,也不确定它是否会被添加到官方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);
}