使用带有STL算法的算符与lambda表达式?

时间:2016-12-09 18:53:46

标签: c++ algorithm lambda stl

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算法时可能有益的情况?

2 个答案:

答案 0 :(得分:2)

是的,你是对的。

lambda表达式基本上创建了一个无名仿函数。它只允许程序员用更少的代码完成它。在C ++ 11之前,标准算法只能用于编程器,这需要程序员为某些特定行为设置一个全新的类(就像你刚才那样)。

这正是为什么将lambda引入C ++ 11的原因,以确保使用带有自定义函子的标准算法不再那么难以写。

答案 1 :(得分:0)

正如Gill Bates所提到的,你是对的,lambda表达式确实创造了一个无名的函子。但是,它也会使代码更难以阅读。我发现,在协作项目中,如果多次使用某些东西,就会更加清楚地重载操作符,特别是如果发生了复杂的事情。

在这方面,如果你谨慎使用lambdas,那就很好。对于至关重要且经常与对象一起使用的功能,您可能希望将所有此类交互封装在重载运算符中。