Lambda vs排序函数

Lambda vs function for sorting

本文关键字:函数 排序 vs Lambda      更新时间:2023-10-16

我有一个class

class Point
{
private:
  int x; int y; 
public:
  Point(int a, int b):x(a),y(b){}
  Point():Point(0,0){}
}

如果我想对一个向量Point s进行排序,我是否应该使用lambda:

std::sort(xSortedPoints.begin(), xSortedPoints.end(),
          [](const cv::Point& p1In, const cv::Point& p2In) -> bool {
              return (p1In.x < p2In.x);
          });

或在类中使用静态函数:

std::sort(xSortedPoints.begin(), xSortedPoints.end(), xSorting);

其中xSortingPoint类中定义和声明为

static bool xSorting(const Point& p1In, const Point& p2In)
{
  return (p1In.x < p2In.x);
}

为什么我应该使用lambda,或者为什么不使用?


编辑:

因为我需要以两种方式排序(按x和按y),所以我没有定义<运算符。

根据评论和回答,我需要说,我在一个持续运行的应用程序中使用了这个,所以排序被执行了很多次。那么,在我的情况下,使用哪个更好:静态还是lambda ?每次使用std::sort时都创建lambda ?如果是,那么我认为静态是最好的选择…没有?

Lambdas的存在是为了方便和流畅的代码。

如果你喜欢使用静态函数,你应该这样做。如果你用过一次,考虑一下。据我所知,使用lambda时没有性能增益。

所以要么做一个静态函数,在适当的地方放一个lambda,或者为类定义小于操作符。

Lambda将使代码更简洁,特别是如果它是像您这样的一行代码。另一方面,我认为如果静态函数方法需要或可以在多个地方使用,那么它将是首选。

这是基于意见的,但简而言之:

如果它很短且不经常使用,则使用lambda。你的例子很简短。如果函数很长、很复杂或经常使用,请给它起一个名字。

在这种特殊情况下,如果有意义,可以考虑为Point重载operator <。然后,不需要sort的第三个参数,但您必须确保<的操作符合天真的读者的期望。

顺便说一句,你可以省略->bool,编译器会自动推导出它

我不知道这里是否有任何性能问题,你得到的答案将是"IM(H)O ...."的类型,所以这里是我的两点意见:

在这种情况下,lambda很好,因为它向阅读代码的人展示了比较两个点的意思。从数学上讲,2D(或任何更高的维度)点不会形成有序集,因此<运算符会令人困惑。有一个静态函数,朋友,…另一方面,将比较的定义与用法放得太远,可能会增加混淆,因为读者必须滚动到定义才能看到您通过比较两个点的意思。