Lambda 是一种就地创建函数对象的方法。函数对象通常用在 C 中使用函数指针作为回调的地方。
一个例子可能是 C qsort 函数。为了能够对任何类型的数组进行排序,您必须给它一个函数的地址,该函数将接收指向数组的两个元素的指针并返回和整数,指示第一个是否小于(应该在之前排序)第二个。 :
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
另一边std::sort不需要比较器功能:
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
但是如果你需要传递一个两个指定一个不同的顺序你可以通过一个函数对象来做到这一点:
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
您可以像 mohaned 一样使用 lambda 创建该函数对象:
sort(v.begin(),
v.end(),
[](int a, int b){ return a > b; }
);
有意使用 lambda、函数对象和函数指针作为参数传递给算法,作为回调以在发生某些事情和类似情况时获得通知。
要将代码划分为有意义的命名片段,您可以将其划分为定义明确的函数。
要将函数作为参数传递给其他函数,函数对象是一种很好的方法。
如果函数对象非常小,只使用了一个,或者你认为给它命名没有好处,你可以把你的函数对象写成 lambda。
您的问题是关于性能的。函数对象(和 lambdas)与函数指针进行比较。他们可以执行得更快。
如果您查看 qsort,它将接收函数的地址,并且每次需要比较时都会调用函数。没有办法内联,因为 qsort 和你的函数是分开编译的。
在 std::sort 示例中,lambda 代码在编译时可用,如果足够简单,编译器将选择内联并避免所有函数调用。
昨天在 isocpp.org 上链接到一篇我强烈推荐的名为 Demystifying C++ lambdas 的精彩博客文章。