【问题标题】:Lambda vs function for sorting用于排序的 Lambda 与函数
【发布时间】:2014-07-23 14:45:07
【问题描述】:

我有课

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

如果我想对Points 的向量进行排序,我应该使用 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),所以我没有定义 &lt; 运算符。

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

【问题讨论】:

  • 还有第三种选择,您可以为您的班级定义一个&lt; 运算符。那么你根本不需要将第三个参数传递给std::sort
  • @JoachimPileborg 尽管它可能对特定的排序函数有意义,但重载的比较运算符在全局上下文中并不总是有意义。 Lambda 可以很好地保持单个函数本地化到其各自的职责。这是一个非常自以为是的问题;所有 3 个都是有效的样式偏好。
  • 我已经编辑了更多信息......但似乎我将在我的情况下使用静态的

标签: c++ lambda


【解决方案1】:

Lambdas 是为了方便和 slick 代码。

如果您更喜欢使用静态函数,您应该这样做。如果您使用它一次,请考虑使用 lambda。 据我所知,使用 lambdas 并没有性能提升。

所以要么做一个静态函数,放置一个适当的 lambda,要么为类定义小于运算符。

【讨论】:

    【解决方案2】:

    Lambda 将使代码更简洁,尤其是在您的情况下它是单行代码时。另一方面,如果需要或可以在多个地方使用,我认为静态函数方法会更受欢迎。

    【讨论】:

      【解决方案3】:

      这是一种基于意见但简而言之:

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

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

      顺便说一句,你可以省略-&gt;bool,编译器会自动推导出来。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-01-19
          • 2017-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多