Lambda vs用于排序的函数

时间:2014-07-23 14:45:07

标签: c++ lambda

我有一个班级

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,为什么不呢?


修改

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

根据评论和答案,我需要说我在一个连续运行的应用程序中使用它,因此排序很多次。那么在我的情况下使用什么更好:静态还是lambdas?每次使用std::sort时都会创建Lambda?如果是的话,我觉得静态是最好的选择......不是吗?

4 个答案:

答案 0 :(得分:3)

Lambdas是为了方便和光滑的代码。

如果您更喜欢使用静态功能,则应该这样做。如果你使用它一次考虑一个lambda。 据我所知,使用lambdas时没有性能提升。

因此,要么执行静态函数,要将lambda放置到位或为类定义小于运算符。

答案 1 :(得分:2)

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

如果它很短并且不经常使用,请使用lambda。你的例子很短。如果函数很长或很复杂或经常使用,请为其命名。

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

顺便说一下,你可以省略->bool,编译器会自动推断它。

答案 2 :(得分:2)

Lambda会使代码更简洁,特别是如果它像你的情况一样是单行的。另一方面,我认为静态函数方法如果需要或可以在多于一个地方使用,则会优先考虑。

答案 3 :(得分:1)

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

在这种情况下,lambda是好的,因为它通过比较两个点来显示正在阅读代码的人。在数学上,2D(或任何更高维度)点不会形成有序集,因此<运算符会令人困惑。另一方面,有一个静态函数,朋友......,这个比较的定义与使用相差太远,再次,可能会增加混乱,因为读者必须滚动到定义,看看你的意思是通过比较两个分。