使用具有STL算法与Lambda表达式的函子

Using functors with STL algorithms versus lambda expressions?

本文关键字:表达式 Lambda 算法 STL      更新时间:2023-10-16

stroustrup给出了使用超载的operator()在转换操作期间对向量元素执行函数的示例:

class Example
{
  public:
   std::vector<int> Test1 {1,2,3,4,5};
   std::vector<int> Test2;
   int operator()(int el);
   void MyFunction();
}
int Example::operator()(int el)
{
  return el + 1;
}
void Example::MyFunction()
{
std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), std::bind(Example(), std::placeholders::_1))
}

但是,随着lambda表达式的引入上述代码似乎很详细,与以下方式相比

std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), [](int el){return el + 1;});

我说使用过载的operator()方法几乎没有价值?还是在使用STL算法时仍然有场景可以有益?

是的,你是对的。

lambda表达式基本上创建一个无名函数。它只允许程序员以更少的代码进行操作。在C 11之前,标准算法只能与函子一起使用,该算法需要程序员为某些特定行为设置一个全新的课程(就像您刚刚做到的那样)。

这正是将lambda引入C 11的原因,以确保使用具有自定义函数的标准算法再不再痛苦。

正如吉尔·贝茨(Gill Bates)提到的那样,您是正确的,lambda表达式确实会创建一个无名函数。但是,它还可以使代码更难阅读。我发现,在协作项目中,如果使用不止一次使用,则通常会更清楚地超载操作员,尤其是在发生复杂的事情时。

在这一点上,如果您很少使用Lambdas,则很好。对于至关重要的功能并经常与对象一起使用,您可能需要将所有此类交互封装在超载运算符中。