Lambda vs排序函数
Lambda vs function for sorting
我有一个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);
其中xSorting
在Point
类中定义和声明为
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(或任何更高的维度)点不会形成有序集,因此<
运算符会令人困惑。有一个静态函数,朋友,…另一方面,将比较的定义与用法放得太远,可能会增加混淆,因为读者必须滚动到定义才能看到您通过比较两个点的意思。
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- std::sort()函数无法对向量的一部分进行排序
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 用于合并排序的合并函数
- 如何计算此排序函数的时间复杂度?
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 自定义排序函数中的堆溢出
- 分段 排序函数实现中的错误
- 使用模板化分配器和对向量进行排序的函数
- 为什么我的函数接受"std::string"进行排序不会改变它?
- 对没有比较器或λ函数的向量进行排序?
- C++中的析构函数和构造函数排序
- 数组中的函数排序错误
- 如何命名比较谓词函数排序向量
- 按lexicographical_compare()函数排序
- 构造函数排序(全局作用域)问题
- 按接受c++中参数的函数排序
- 函数排序错误
- 根据不同函数排序的std::向量的交集